【问题标题】:How to get edited values in ObservableCollectionin WPF(MVVM)如何在 WPF(MVVM) 中的 ObservableCollection 中获取已编辑的值
【发布时间】:2016-04-25 07:00:05
【问题描述】:
 public class PricingGrpModel
 {
    public string Name { get; set; }
    public string Description { get; set; }     
 }

 private ObservableCollection<PricingGrpModel> _myCollection;    
 public ObservableCollection<PricingGrpModel> myCollection
 {
  get { return _myCollection; }
  set { _myCollection= value; OnPropertyChanged("myCollection"); }
 }

myCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(myCollection_CollectionChanged);   

void myCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    try
    {
        switch (e.Action)
        {                 
            case NotifyCollectionChangedAction.Add:                       
                break;

            case NotifyCollectionChangedAction.Remove:
                break;
        }
    }
    catch(Exception exception)
    {              
    }
}  

我已将“myCollection”ObservableCollection 绑定到 DataGrid 的 ItemsSource。添加或删除行时触发的集合更改事件。但我无法跟踪现有行值的变化。当 ObservableCollection 中的项目属性发生更改时,如何获得通知?

【问题讨论】:

  • 您希望PricingGrpModel 实现INotifyPropertyChangedmsdn.microsoft.com/en-us/library/…
  • 只是为了澄清:ObservableCollection 不知道项目的特定变化,ObservableCollection 可以告知您自身的变化,例如新项目或删除的项目。因此,正如 Chris Wohlert 所说,您需要在 PricingGrpModel 上实现 INotifyPropertyChanged 才能处理每个单独对象的任何更改。
  • "PricingGrpModel" 类是一个实体类,它的意思是从 EF 生成的,那么我该如何实现 'INotifyPropertyChanged'..?
  • 创建PricingGrpViewModel
  • 我们不能不创建一个新类吗?

标签: c# wpf mvvm


【解决方案1】:

您可以使用NotifyCollectionChangedEventArgsNewItemsOldItems 属性。

当您调用 ObservableCollection.Remove() 时,删除的项目将出现在 OldItems 属性中:

void myCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.OldItems != null)
    {
         foreach (var removedItem in e.OldItems)
         {
         }
    }
}

唯一的问题是,当您调用ObservableCollection.Clear() 方法时,OldItems 属性为空。

如果您还想访问已清除的项目,则必须通过从 ObservableCollection 继承来创建自定义类并覆盖 RemoveItem 受保护的方法。 RemoveItem 方法也会在您调用 ObservableCollection.Clear() 时被调用您可以从这个答案中使用我的 ExtendedObservableCollection:Trigger InotifyPropertyChanged/CollectionChanged on ObservableCollection

【讨论】:

    【解决方案2】:

    您不能通过 CollectionChanged 事件直接跟踪项目更改。 你可以做的是: 为 ObservableCollection 中的每个项目添加和删除一个 EventHandler 到 CollectionChanged EventHandler 中的 PricingGrpModel.PropertyChanged

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 2013-11-17
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多