如何检测我的ObservableCollection中的项是否已更改

Rem*_*tec 20 c# wpf inotifypropertychanged wpfdatagrid

我有一个绑定的数据网格ObservableCollection<Product>.更新网格后,这会自动更新集合中的Product对象.

我现在要做的是在集合中的任何对象被更新时触发某种甚至触发 - 或者 - 某种类型的绑定到集合,如果任何Product已经更新,它将返回true/false depedant.

总体目标是在我的主窗口上有一个保存按钮,如果没有对我的集合进行任何更改则禁用该按钮,如果已进行了更改,则启用该按钮.

我已阅读INotifyPropertyChange但我不知道如何使用它来监控整个集合的变化.

另外,如果我在Product类上实现此接口,我不会看到我的UI如何监视集合中的每个产品 - 或者它可以吗?

cho*_*dze 15

  • INotifyPropertyChanged在您的Product班级中实施每个属性的通知.
  • INotifyPropertyChanged在您的viewmodel中实现.
  • 将属性添加IsDirty到ViewModel(通知通过INotifyPropertyChanged.
  • 在您的viewmodel中,订阅 CollectionChanged

    public YourViewModel()
    {
        ...
        YourCollection.CollectionChanged += YourCollection_CollectionChanged; 
        ...
    }
    
    private void YourCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args)
    {
        if (args.OldItems != null)
            foreach(var oldItem in args.OldItems)
                oldItem.PropertyChanged -= YourItem_PropertyChanged;
    
        if (args.NewItems != null)
            foreach(var newItem in args.NewItems)
                newItem.PropertyChanged += YourItem_PropertyChanged;
    }
    
    private void Youritem_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs args)
    {
        IsDirty = true;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在您可以绑定到IsDirtyviewmodel的属性,例如,您可以将Button.IsEnabled属性直接绑定到它.


Man*_*ani 1

逻辑需要放入您的模型(产品类)中。一种干净的方法是IsDirty在模型中公开属性(由字段支持)。

并且您的 ViewModel 将具有一个命令绑定来CanSave检查内部集合,并且如果集合中的任何项目返回 true IsDirty=true