实现INotifyPropertyChanged接口时,每次在类中更新属性时,您都要负责调用PropertyChanged事件。
这通常会导致以下代码:
public class MyClass: INotifyPropertyChanged
private bool myfield;
public bool MyField
{
get { return myfield; }
set
{
if (myfield == value)
return;
myfield = value;
OnPropertyChanged(new PropertyChangedEventArgs("MyField"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler h = PropertyChanged;
if (h != null)
h(this, e);
}
}
每个属性 12行。
如果一个人能够装饰像这样的自动属性,那就简单多了:
[INotifyProperty]
public double MyField{ get; set; }
但不幸的是,这是不可能的(例如,请参阅msdn上的this post)
如何减少每个属性所需的代码量?
答案 0 :(得分:6)
实际上,每个属性只有3-4行 ;所有“通知”属性中的其他行摊销:
class Person : INotifyPropertyChanged
{
#region INotifyPropertyChanged: Shared bit
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
#endregion
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
if (_firstName == value)
return;
_firstName = value;
OnPropertyChanged(new PropertyChangedEventArgs("FirstName"));
}
}
// Ditto for other properties
}
你可以尝试类似下面的内容,它会分担更多的负载:
private string _firstName;
public string FirstName
{
get { return _firstName; }
set { SetNotifyingProperty("FirstName", ref _firstName, value); }
}
private void SetNotifyingProperty<T>(string propertyName,
ref T field, T value)
{
if (value.Equals(field))
return;
field = value;
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
答案 1 :(得分:2)
我现在所做的是在课堂上写这个:
//AUTOGENERATE INotifyProperty
private bool myfield;
我编写了一个小工具,可以在部分类中生成所有需要的属性代码。 这绝不是一个优雅的解决方案,但它有效:)
答案 2 :(得分:1)
外包最有意义。
使用以下代码编写一个类(ObservableObject):
class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
得益于protected,从此类派生的所有类都可以访问该方法。
示例:
class Example : ObservableObject
{
//propfull
private string name;
public string Name
{
get {return name;}
set
{
name = value;
OnPropertyChanged(nameof(Name));
}
}
}