【问题标题】:Tracking only the Items in the observableCollection that have changed.Is this possible?仅跟踪 observableCollection 中已更改的项目。这可能吗?
【发布时间】:2010-07-12 15:38:04
【问题描述】:

我有一个绑定到员工 observableCollection 的数据网格 允许用户通过双击 datagridRow 进行行编辑。 绑定相关属性时,我还使用 UpdateSourceTrigger。

当我用户按下保存按钮时,我的 MVVM 中触发了 saveCommand,我想创建一个仅包含我修改过属性的员工的列表。

我所有的 ViewModel 都实现了 INotifyPropertyChanged。

尽管 google 上有很多链接,但我似乎找不到一个示例来指导您了解或解释如何跟踪 observablecollection 中已更改的项目。

你能帮忙吗?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    为您的 Employee 创建基类,例如 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 对其进行标记,然后您可以仅从集合中请求更改的实体并根据需要对其进行处理。

    【讨论】:

    • 感谢您的帮助/回复。您是说钩住 observableCollection 的 CollectionChanged 事件,然后将您的项目标记为脏,这就是您的意思?
    • 这个属性是你自己设置的。可能在 setter 中,可能在自定义 PropertyChangedCallback 的方法上。这个想法是:当对象的某些属性发生变化时 - 将该对象标记为已更改。事情很简单,例如,当只有 1% 的实体发生变化时,您不需要将所有集合发布到数据库中以更新它。
    • 这正是我想要达到的目标。让我尝试一下,然后回来找你。
    • 嗨,按照您的描述添加一个属性 EntityState,然后在设置器中设置 State=Changed 当我加载我的员工时,我将所有设置为已添加。然而,即使我只改变了一个,它仍然说我已经全部改变了。由于我的用户正在编辑数据网格,然后按保存需要找到可以跟踪哪个员工已更改并设置为“已更改”的事件。我是否让事情变得复杂而遗漏了一些非常简单的事情?
    • 加载实体时,必须将它们设置为 NotChanged。当您的应用添加实体时,您设置已添加,如果删除 - 已删除。如果属性更改 - 更改。然后,当您要提交更改时,您对已处理的实体执行相应的操作。例如,当您在列表的 TextBox 中更改员工姓名时 - 将状态设置为已更改。然后提交除 NotChanged 之外的所有状态。
    【解决方案2】:

    我不知道有任何内置方法可以做你想做的事。

    我过去所做的是在集合中的对象上实现布尔 IsDirty 属性。然后在引发 PropertyChanged 时将 IsDirty 属性设置为 true。

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 2011-08-11
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多