ObservableCollection的setter在添加项目时不会触发。

14 浏览
0 Comments

ObservableCollection的setter在添加项目时不会触发。

我正在使用MVVM Light框架在WPF项目中工作。我有一个绑定到ObservableCollection的DataGrid。目前,当我添加一个新项时,DataGrid不会更新,我认为这是因为setter从未触发。

public ObservableCollection MasterWorkerList

{

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)

希望能得到一些建议。如果你需要更多的代码,请告诉我。

0
0 Comments

ObservableCollection的setter不会在添加项时触发的原因是,setter只会在集合本身的引用发生变化时触发,而不会在集合的内容发生变化时触发。这意味着当我们向ObservableCollection添加或删除项时,集合本身的引用并没有发生变化,因此setter不会被调用。

要解决这个问题,我们可以使用ObservableCollection的CollectionChanged事件来通知集合的内容发生了变化。当项被添加或删除时,CollectionChanged事件会被触发,我们可以在事件处理程序中执行相应的操作。

以下是一个示例代码,演示了如何处理ObservableCollection的CollectionChanged事件:

public class ViewModel
{
    public ObservableCollection MyObservableCollection { 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在添加项时不触发的问题。

0
0 Comments

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"消息框。你可以根据需要在事件处理程序中添加适当的逻辑。

希望这个解决方案对你有帮助!

0