WPF MVVM Привязка списка в пользовательском элементе управления к ViewModel - PullRequest
0 голосов
/ 10 декабря 2010

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

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

У меня есть пользовательский элемент управления (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}">

Как сделать такую ​​привязку?

1 Ответ

2 голосов
/ 10 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...