2010-12-10 4 views
0

Возможно ли связывать данные в «неправильном» направлении? Я хочу, чтобы значение в пользовательском элементе управления привязывалось к моей ViewModel. Я попробовал привязку с режимом «OneWayToSource», но я не могу заставить его работать.WPF MVVM Список привязок к пользовательскому управлению для ViewModel

Сценарий (упрощенно):

У меня есть пользовательский элемент управления (MyCustomControl), который имеет свойство зависимостей, которое является списком строк:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     //Make sure the template in Themes/Generic.xaml is used. 
     DefaultStyleKeyProperty.OverrideMetadata(typeof (MyCustomControl), new FrameworkPropertyMetadata(typeof (MyCustomControl))); 

     //Create/Register the dependency properties. 
     CheckedItemsProperty = DependencyProperty.Register("MyStringList", typeof (List<string>), typeof (MyCustomControl), new FrameworkPropertyMetadata(new List<string>())); 
    } 

    public List<string> MyStringList 
    { 
     get 
     { 
      return (List<string>)GetValue(MyCustomControl.MyStringListProperty); 
     } 
     set 
     { 
      var oldValue = (List<string>)GetValue(MyCustomControl.MyStringListProperty); 
      var newValue = value; 
      SetValue(MyCustomControl.MyStringListProperty, newValue); 
      OnPropertyChanged(new DependencyPropertyChangedEventArgs(MyCustomControl.MyStringListProperty, oldValue, newValue)); 
     } 
    } 
    public static readonly DependencyProperty MyStringListProperty; 
} 

управления также содержит код для манипулирования этим список.

Я использую этот настраиваемый элемент управления в UserControl, который имеет ViewModel. ViewModel имеет свойство, которое также список строк:

public List<string> MyStringsInTheViewModel 
{ 
    get 
    { 
     return _myStringsInTheViewModel; 
    } 
    set 
    { 
     if (value != _myStringsInTheViewModel) 
     { 
      _myStringsInTheViewModel = value; 
      OnPropertyChanged("MyStringsInTheViewModel"); 
     } 
    } 
} 
private List<string> _myStringsInTheViewModel; 

Теперь я хочу, чтобы связать список в моем таможенном контроле (MyStringList) в список в моем ViewModel (MyStringsInTheViewModel), так что, когда список изменяется в пользовательском контроле он также изменяется в ViewModel. Я пробовал это, но не могу заставить его работать ...

<myns:MyCustomControl MyStringList="{Binding Path=MyStringsInTheViewModel, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"> 

Как я могу сделать такое связывание?

+0

Почему вы используете `OneWayToSource`? Я подозреваю, что удаление «Mode» и «UpdateSourceTrigger» может быть достаточно для того, чтобы привязка работала. – 2010-12-10 12:14:40

ответ

2

Использовать ObservableCollection<T> вместо List<T>. Он реализует интерфейс INotifyCollectionChanged.

+0

А, это была проблема. Я мой реальный код Я фактически использовал BindingList в ViewModel, но List в пользовательском элементе управления. Изменение для использования BindingList также в пользовательском контроле устраняет проблему. Спасибо, Илья! :) – haagel 2010-12-10 12:14:42

Смежные вопросы