2010-07-12 56 views
1

我有一个绑定到Employees的observableCollection的数据网格 用户可以通过双击datagridRow进行在线编辑。 当绑定有问题的属性时,我也使用UpdateSourceTrigger。仅跟踪已更改的observableCollection中的项目。是否有可能?

当我用户按下保存按钮时,saveCommand在我的MVVM中被触发,我想创建一个只有我修改了属性的雇员的列表。

我所有的ViewModel实现INotifyPropertyChanged。

尽管谷歌链接很多,我似乎无法找到一个例子,带你通过或解释如何跟踪已在observablecollection中更改的项目。

你能帮忙吗?

回答

2

创建基类为您的员工,例如,EntityBase和枚举描述其状态:

public enum EntityState 
    { 
     NotChanged, 
     Changed, 
     Added, 
     Deleted 
    } 

    public abstract class EntityBase : INotifyPropertyChanging, INotifyPropertyChanged 
    { 
     public event PropertyChangingEventHandler PropertyChanging; 
     public event PropertyChangedEventHandler PropertyChanged; 

     private EntityState state = EntityState.NotChanged; 

     public EntityState State 
     { 
      get { return state; } 
      set { state = value; } 
     } 

     public EntityBase() 
     { 
      state = EntityState.NotChanged; 
     } 

     protected virtual void SendPropertyChanging(string propertyName) 
     { 
      if ((this.PropertyChanging != null)) 
      { 
       this.PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); 
      } 
     } 
     protected virtual void SendPropertyChanged(string propertyName) 
     { 
      if ((this.PropertyChanged != null)) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

    } 

当收集您的聘用过的员工的一个变化 - 与EntityState.Changed纪念它,那么你只能申请从收集中更改实体并根据需要处理它们。

+0

感谢您的帮助/答复。 你是说钩住了observableCollection的CollectionChanged事件,然后在那里标记你的物品脏了 是你的意思吗? – user9969 2010-07-12 15:52:27

+0

地点是你自己设定这个属性。可能在setter中,可能会自定义PropertyChangedCallback的方法。这个想法是:当对象的某些属性发生变化时 - 将该对象标记为已更改。事情非常简单,例如,您不需要将所有集合发布到数据库中,以便更新它时,只有1%的实体发生更改。 – 2010-07-12 15:59:07

+0

这正是我想要达到的目标。让我走了,回到你身边。 – user9969 2010-07-12 16:00:56

0

我不知道任何内置的方式来做你想做的。

我过去所做的是在集合中的对象上实现布尔型​​IsDirty属性。然后在您提出PropertyChanged时,将IsDirty属性设置为true。

相关问题