有没有更好的方法在ViewModel上编写此代码?

时间:2014-04-15 01:39:31

标签: c# wpf optimization mvvm

在MVVM和WPF上看起来很新,我发现自己在ViewModel中编写了大量相同的代码来公开属性然后在我的WPF控件上绑定。像这样:

private Vendedores _vendedorsel;
public Vendedores VendedorSel
    {
        get
        {
            return _vendedorsel;
        }

        set
        {
            this._vendedorsel = value;
            OnPropertyChanged("VendedorSel");
        }
    }

有没有更好的方法来做到这一点,没有这么多类似的代码?也许涉及继承的东西?谢谢。

2 个答案:

答案 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大大减少了重复不需要的手动定义属性的代码!所以感谢任何人!