在MVVM和WPF上看起来很新,我发现自己在ViewModel中编写了大量相同的代码来公开属性然后在我的WPF控件上绑定。像这样:
private Vendedores _vendedorsel;
public Vendedores VendedorSel
{
get
{
return _vendedorsel;
}
set
{
this._vendedorsel = value;
OnPropertyChanged("VendedorSel");
}
}
有没有更好的方法来做到这一点,没有这么多类似的代码?也许涉及继承的东西?谢谢。
答案 0 :(得分:1)
您可以在基本方法中使用CallerMemberName稍微减少一点,如果您重命名该属性,也可以使重构更容易:
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChangedEventArgs ea = new PropertyChangedEventArgs(propertyName);
if (PropertyChanged != null)
PropertyChanged(this, ea);
}
这会将您的媒体资源代码缩减为:
public Vendedores VendedorSel
{
get
{
return _vendedorsel;
}
set
{
this._vendedorsel = value;
OnPropertyChanged();
}
}
使用Geek的答案提到的框架可以获得类似的收益,但在大多数情况下仍需要一些样板文件。面向方面的编程可用于将所有这些内容注入到自动属性中,但如果您没有使用AOP执行任何其他操作,这也可能需要做很多事情。
通常最好的办法就是为你制作样板文件的一些好的片段。
答案 1 :(得分:1)
我在这个伟大的Blog中找到了对这个问题的优秀答案。 我无法理解为什么我需要从每个setter上的每个属性触发OnPropertyChanged以及为什么我不能在我的ViewModel上使用这样的自动实现的属性:
public Vendedores VendedorSel {get; set;}
上面的博客中显示的是,在95%的情况下,你可以! 为什么?:因为解雇OnPropertyChanged的唯一原因是该属性是修改OUTSIDE视图的范围并通知它 的"哎!这个属性改变了!请自行更新" 但在大多数情况下,属性只在视图中修改!在这种情况下是不需要OnPropertyChange !!
更多!我甚至可以在ViewModel Contructor上为属性设置默认值,并且仍然不需要触发OnPropertyChanged,因为在进行绑定之前执行了构造函数。这个whille大大减少了重复不需要的手动定义属性的代码!所以感谢任何人!