ViewModel如何告诉我的属性中的自定义控件更改?

时间:2015-09-02 05:21:36

标签: c# xaml

我有一个自定义控件调用“MyControl”。它有一个属性'ControlLists',它是一个IList。我将viewModel'MyViewModel'绑定到我的自定义控件。并且'MyViewModel'具有绑定到ControlLists的ViewModelLists。

像这样:

 <DataTemplate x:Key="MyDataTemplate">
        <myapp:MyControl
         ControlLists="{Binding ViewModelLists}"
        />
  </DataTemplate>

我的问题是,如果My ViewModel对其ViewModelLists进行更改(添加/删除),它如何告诉'MyControl'刷新其'ControlList'?

在MyViewModel中,我有

 public override IList<Items> ViewModelLists {
      return myList;// myList is ObserverableCollection<Items>
 }

在MyControl中,我有

 public IList<Items> ControlLists
        {
            get
            {
             ...
             }
             set
             {
              ...
              }
           }

我的问题是当我在MyControl的设置中设置断点时,为什么值始终为null?我希望它是我绑定到的ViewModel中的ObserverableCollection。

绑定时是否调用了我的控件属性的setter?

2 个答案:

答案 0 :(得分:0)

如果将ViewModelLists公开为ObservableCollection,则控件将自动知道列表何时更改。

答案 1 :(得分:0)

假设绑定到ControlLists的属性是ObservableCollection,它会在添加,删除或清除项目时自动通知绑定控件。还有一个“CollectionChanged”事件,如果你需要在列表中添加和删除项目时对它们做出反应,你可以订阅它们。

但是,如果您直接设置绑定集合属性,即通过将其值直接设置为项集合来初始化集合,我相信这会被忽略,例如:

public ObservableCollection<Things> TheThings {get;set;}

TheThings = new ObservableCollection<Things>(listOfthings);

在这种情况下,您希望将集合属性从autoproperty更改为具有支持值的完整属性,以便在值更改时可以引发notifypropertychanged,如此

        private ObservableCollection<Things> theThings= new ObservableCollection<Things>();
    public ObservableCollection<Things> TheThings
    {
        get { return this.theThings; }
        set
        {
            this.theThings= value;
            RaisePropertyChanged(); // <-- something like this
        }
    }

我希望这有用!

相关问题