WPF MVVM将自定义控件上的列表绑定到ViewModel

时间:2010-12-10 11:29:27

标签: wpf mvvm binding

是否有可能以“错误”的方向绑定数据?我希望自定义控件中的值绑定到我的ViewModel。我尝试使用“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;
}

该控件还包含操作此列表的代码。

我在具有ViewModel的UserControl中使用此自定义控件。 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 个答案:

答案 0 :(得分:2)

使用ObservableCollection<T>代替List<T>。它实现了INotifyCollectionChanged接口。