ObservableCollection的setter在添加项目时不会触发。
ObservableCollection的setter在添加项目时不会触发。
我正在使用MVVM Light框架在WPF项目中工作。我有一个绑定到ObservableCollection
public ObservableCollection
{
get { return _masterWorkerList; }
set
{
System.Windows.MessageBox.Show("Firing");
_masterWorkerList = value;
RaisePropertyChanged(() => MasterWorkerList);
}
}
即使我调用以下代码,消息框也不会显示:
DataManager.Data.MasterWorkerList.Add(_create.NewWorker());
如何使RaisPropertyChanged触发,以便我可以更新UI?
我尝试过这个帖子中的解决方案,但没有成功:ObservableCollection not noticing when Item in it changes (even with INotifyPropertyChanged)
希望能得到一些建议。如果你需要更多的代码,请告诉我。
ObservableCollection的setter不会在添加项时触发的原因是,setter只会在集合本身的引用发生变化时触发,而不会在集合的内容发生变化时触发。这意味着当我们向ObservableCollection添加或删除项时,集合本身的引用并没有发生变化,因此setter不会被调用。
要解决这个问题,我们可以使用ObservableCollection的CollectionChanged事件来通知集合的内容发生了变化。当项被添加或删除时,CollectionChanged事件会被触发,我们可以在事件处理程序中执行相应的操作。
以下是一个示例代码,演示了如何处理ObservableCollection的CollectionChanged事件:
public class ViewModel { public ObservableCollectionMyObservableCollection { get; set; } public ViewModel() { MyObservableCollection = new ObservableCollection (); MyObservableCollection.CollectionChanged += MyObservableCollection_CollectionChanged; } private void MyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { // 处理集合内容变化的逻辑 // 在这里可以更新UI或执行其他操作 } }
在这个示例中,ViewModel类包含一个ObservableCollection属性MyObservableCollection。在ViewModel的构造函数中,我们订阅了MyObservableCollection的CollectionChanged事件,并指定了事件处理程序MyObservableCollection_CollectionChanged。
当MyObservableCollection的内容发生变化时,MyObservableCollection_CollectionChanged方法会被调用,并传递一个NotifyCollectionChangedEventArgs参数,该参数包含了有关集合变化的详细信息。我们可以根据需要在事件处理程序中执行相应的逻辑,例如更新UI或执行其他操作。
通过使用CollectionChanged事件,我们可以确保在ObservableCollection的内容发生变化时能够及时通知相关的代码,并采取相应的措施。这样,我们就能够解决ObservableCollection setter在添加项时不触发的问题。
ObservableCollection的setter在添加项目时没有触发的原因是,你不应该在对象的列表上有公共的setter。相反,你应该在构造函数中设置它。
ObservableCollection的CollectionChanged事件在向ObservableCollection添加项目时被调用。如果你需要更深入的控制,你可以继承ObservableCollection并重写AddItem和RemoveItem方法。
为了解决这个问题,你需要将ObservableCollection的实例化和事件处理放在构造函数中,并在CollectionChanged事件处理程序中添加你需要的逻辑。
以下是解决方法的示例代码:
public class MyClass { private ObservableCollection_masterWorkerList; public MyClass() { _masterWorkerList = new ObservableCollection (); _masterWorkerList.CollectionChanged += OnCollectionChanged; } public ObservableCollection MasterWorkerList { get { return _masterWorkerList; } } private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { System.Windows.MessageBox.Show("Firing"); //RaisePropertyChanged(() => MasterWorkerList); } } public class Worker { // Worker class implementation }
在上述示例中,我们将ObservableCollection的实例化和CollectionChanged事件处理程序都放在了构造函数中。这样,当向MasterWorkerList添加项目时,CollectionChanged事件将被触发,并显示"Firing"消息框。你可以根据需要在事件处理程序中添加适当的逻辑。
希望这个解决方案对你有帮助!