我有以下项目的层次结构:
customFields
如果我希望通过对MainClass
{
List<Configuration> MyList = new List<Configuration>;
}
Configuration
{
CustomObject MyObject = new CustomObject;
string Property = "";
}
CustomObject
{
string InnerProperty = "";
}
和MainClass
所做的每次更改通知InnerProperty
,我是否认为必须将Property
转换为{{}} {1}}并且List
和ObservableCollection
都应来自Configuration
,对吗?
如果我只希望在CustomObject
更改时收到通知,而不是INotifyPropertyChanged
,那么InnerProperty
Property
或CustomObject
也只能来自INotifyPropertyChanged
。既然我会失去通知父母的通知??
答案 0 :(得分:2)
要获得有关InnerProperty和Property的通知,您通常不需要ObservableCollection。 ObservableCollection仅用于添加\删除项目的通知。因此,您需要在Configuration和CustomObject上实现INotifyPropertyChanged。如果您只对InnerProperty的更改感兴趣,则在您的MyObject属性永远不会更改并在构造函数中分配时,不需要在Configuration上使用INotifyPropertyChanged。否则,您需要再次在两者上实现INotifyPropertyChanged。顺便说一下ObservableCollection的相同故事 - 如果您的列表包含固定的项目列表 - 您不需要它来接收来自属性的通知。否则你会这样做。
答案 1 :(得分:1)
如果我只想在InnerProperty被更改时获取通知,而不是属性,那么只有CustomObject也可以从INotifyPropertyChanged或CustomObject派生(因为我会丢失通知传输给父级)?
(我假设对于该句中的第二个CustomObject
,您实际上是指Configuration
。)
如果您只更改InnerProperty
而MyProperty
没有更改,那么您只需要CustomObject
实施INotifyPropertyChanged
。没有任何变化感传播到链条上。
如果您有绑定路径:
{Binding Path=A.B.C.D}
然后,如果其中任何属性发生更改并且您希望更新绑定,则相关级别必须实现INotifyPropertyChanged
。如果属性是不可变的(不会发生变化),那么就不需要支持变更通知。您可以认为绑定正在侦听通过绑定路径评估返回的每个对象的更改。
答案 2 :(得分:1)
我会尝试回答你的概念问题。但代码很好......
我首先只指向C#:: When to use events or a collection of objects derived from an event handling Interface?,我觉得这很有帮助。
ObservableCollection
负责在添加或删除项目时引发事件。不需要INotifyPropertyChanged,这是自动存在的。如果您绑定到ObservableCollection
中的XAML
,则XAML
会注册这些活动,而您自己也不需要做任何事情。但是,除非你注册,否则没有别的东西在听这些事件。你可以这样做:
myObservablecollection.CollectionChanged += myHandler;
但我不认为这就是你想要的。如果您现在想要在MainClass.MyList
添加或删除某些内容,那么将其设为ObservableCollection
即可。但您想知道列表中的某个特定项目何时被修改,而ObservableCollection
对此没有帮助。
假设您希望Configuration
在CustomObject
更改时执行某些操作。也许它将Property
(不是一个好名字?)设置为MyObject.ToString()
。然后让CustomObject
实现INotifyPropertyChanged,如下所示:
Class CustomObject : INotifyPropertyChanged
{
private string _innerProperty;
public string InnerProperty
{get { return _innerProperty; }
{set
{
_innerProperty = value;
OnPropertyChanged("InnerProperty");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
}
然后在配置中:
Class Configuration
{
...
public Configuration(...)
{
... // set up stuff
MyObject.PropertyChanged += myObjectChanged_DoSomethingAboutIt;
}
private void myObjectChanged_DoSomethingAboutIt()
{
DoSomething();
// for example:
Property = MyObject.ToString();
}
}
我希望这会有所帮助。 更多信息:http://www.codeproject.com/Articles/41817/Implementing-INotifyPropertyChanged