Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跟踪对象树中的修改_C#_.net_User Interface_Design Patterns - Fatal编程技术网

C# 跟踪对象树中的修改

C# 跟踪对象树中的修改,c#,.net,user-interface,design-patterns,C#,.net,User Interface,Design Patterns,我的WPF应用程序显示了具有某些属性的对象树。可以通过数据绑定从UI修改这些属性。可以添加或删除对象本身。没什么特别的 问题是:了解对象树中某个地方的更改的最佳方法是什么? 迄今为止考虑的想法: 创建一个静态方法,在修改时由每个对象调用 在每个对象类型上创建静态事件并侦听它 在每个对象上实现INotifyPropertyChanged,并让它们都将修改通知其父对象,以便我可以侦听对象树根上的一个事件 收听来自控件的事件,如TextChanged,Checked等 它们看起来都像丑陋的网格,所

我的WPF应用程序显示了具有某些属性的对象树。可以通过数据绑定从UI修改这些属性。可以添加或删除对象本身。没什么特别的

问题是:了解对象树中某个地方的更改的最佳方法是什么?

迄今为止考虑的想法:

  • 创建一个静态方法,在修改时由每个对象调用
  • 在每个对象类型上创建静态事件并侦听它
  • 在每个对象上实现
    INotifyPropertyChanged
    ,并让它们都将修改通知其父对象,以便我可以侦听对象树根上的一个事件
  • 收听来自控件的事件,如
    TextChanged
    Checked

它们看起来都像丑陋的网格,所以我害怕实现它们中的任何一个。

INotifyPropertyChanged可能是最好的方法,因为它允许您从任何根节点冒泡出更改通知。我想这还取决于你的类型有多复杂,以及你想对什么样的更改做出反应?

如果comeone感兴趣的话,我最终从负责跟踪
IsDirty
状态并在对象树上下提升的共同祖先那里对树中的所有对象进行了子类化。我的意思是,如果某个对象被标记为脏的,那么它的所有父对象也被认为是脏的。是的,我在这个公共超类中实现了
INotifyPropertyChanged
,以了解这些更改。

我不明白为什么这个问题需要“algorithm”标记。答案可能非常笼统。可能在其他语言/框架中使用了一些常见的做法。我只想知道是否有任何更改。只需启用“保存”按钮。任何特性更改或对象添加/删除都视为更改。