我正在使用WPF和MVVM,因此我的视图模型中有很多属性绑定到视图中的东西。这些属性中的大多数看起来像这样......
private DateTime _newRevisionDate = DateTime.Now;
public DateTime NewRevisionDate {
get {
return _newRevisionDate;
}
set {
if (_newRevisionDate != value) {
_newRevisionDate = value;
RaisePropertyChanged(ViewModelUtils.GetPropertyName(() => NewRevisionDate));
}
}
}
我正在使用MvvmLight,这是RaisePropertyChanged()方法的来源,并使用ViewModelUtils.GetPropertyName()方法从属性名称创建一个字符串,从而避免使用魔术字符串。
现在,问题在于如果我向视图模型添加一些这样的属性,我最终会得到大量几乎完全相同的代码。这只是为了一些巧妙的重构而烦恼,所以我可以使用一行代码来定义每个属性。
但是,我还没有办法找到任何办法。什么是好的是能够做类似标准的C#自动属性......
public DateTime NewRevisionDate { get; set; }
...但只要将属性设置为新值,就让它调用RaisePropertyChanged()。
任何想法?感谢
答案 0 :(得分:3)
这只是急于进行一些巧妙的重构,所以我可以使用一行代码来定义每个属性。
你现在可以把它变成一条线。它只是一个长行:)
C#5使用caller info attributes使这更容易一些,因此您不需要GetPropertyName
部分 - 这是您当前代码中最丑陋的部分。
你可以做的另一件事是:
set
{
_newRevisionDate = PossiblyFireEvent(RaisePropertyChanged, _newRevisionDate, value);
}
其中PossiblyFireEvent
将属性名称作为可选参数使用调用者信息属性,RaisePropertyChanged
作为委托,如果两个值不相等则执行,并始终返回value
。不确定它是否值得。