ViewModel如何告诉我的自定义控件改变我的属性

本文关键字:我的 改变 属性 自定义控件 ViewModel 何告诉 | 更新日期: 2023-09-27 18:10:58

我有一个自定义控件MyControl。它有一个属性ControlLists它是一个列表。我绑定了一个viewModel MyViewModel到那个我的自定义控件。和'MyViewModel'有一个ViewModelLists绑定到控制列表。

:

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

我的问题是,如果我的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 ?

ViewModel如何告诉我的自定义控件改变我的属性

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

但是,我相信如果您直接设置绑定集合属性,也就是说,您通过将其值直接设置为项的集合来初始化集合,例如:

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

TheThings = new ObservableCollection<Things>(listOfthings);

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

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

我希望这是有帮助的!

如果你将ViewModelLists公开为ObservableCollection,那么当列表发生变化时,控件将自动知道。