【发布时间】:2016-12-18 04:36:02
【问题描述】:
在没有set 但get 取决于其他字段的情况下,c# 中通知项目字段上的属性更改的最佳方法是什么?
例如:
public class Example : INotifyPropertyChanged
{
private MyClass _item;
public event PropertyChangedEventHandler PropertyChanged;
public MyClass Item
{
get
{
return _item;
}
protected set
{
_item = value;
OnPropertyChanged("Item");
}
}
public object Field
{
get
{
return _item.Field;
}
}
#if !C#6
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#else
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
// => can be called in a set like this:
// public MyClass Item { set { _item = value; OnPropertyChanged();} }
// OnPropertyChanged will be raised for "Item"
}
#endif
}
在设置 Item 时,为 "Field" 提升 PropertyChanged 的最佳方法是什么?我想在设置Item 时调用OnPropertyChanged("Field");,但如果我有很多字段,代码很快就会变得丑陋且无法维护。
编辑:
我想知道是否有这样的函数/方法/属性:
[DependOn(Item)]
public object Field
{
get
{
return _item.Field;
}
}
=> 当Item 发生变化时,所有依赖的字段都会通知属性发生变化。
它存在吗?
【问题讨论】:
-
你可以为
MyClass实现INotify -
FieldinMyClass不会改变,实例 _item 被另一个替换。在我的例子中,MyClass包含一个 xml 文本。我通过 webRequest 获取MyClass的新实例并将其保存在_item上。_item.Field无法通知属性更改,因为Field只是解析xml文件的get。