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

C# 有没有更好的方法在ViewModel上编写此代码?,c#,wpf,optimization,mvvm,C#,Wpf,Optimization,Mvvm,作为MVVM和WPF的新手,我发现自己在ViewModel中编写了大量几乎相同的代码,以公开属性,然后绑定WPF控件。大概是这样的: private Vendedores _vendedorsel; public Vendedores VendedorSel { get { return _vendedorsel; } set { this._vendedor

作为MVVM和WPF的新手,我发现自己在ViewModel中编写了大量几乎相同的代码,以公开属性,然后绑定WPF控件。大概是这样的:

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

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

没有这么多类似的代码,有没有更好的方法?也许是涉及到继承的事情?谢谢。

通过在基本方法中使用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做任何其他事情,那么这也可能是一个很大的任务


通常,让这个问题变得不那么痛苦的最好方法是使用一些好的代码片段为您生成样板文件。

我在这篇伟大的文章中找到了一个很好的答案。 我不明白为什么我需要在每个setter上的每个属性上激发PropertyChanged,为什么我不能在我的ViewModel上使用这样一个自动实现的属性:

public Vendedores VendedorSel {get; set;}
上面博客中的观点是,在95%的情况下,你可以!!! 为什么?:因为激发PropertyChanged的唯一原因是如果属性在视图范围之外被修改,并通知它 “嘿!此属性已更改!请更新您自己” 但在大多数情况下,属性仅在视图中修改!在这种情况下,不需要更改属性


甚至更多!我甚至可以在ViewModel构造函数上设置属性的默认值,但仍然不需要激发OnPropertyChanged,因为构造函数是在绑定之前执行的。这将大大减少我的代码重复不必要的手动定义的属性!所以感谢所有人

谢谢你的回答。我尝试了这个,但找到了一个更好的解决方案,一个后咆哮。请看一看。谢谢您可以尝试使用许多“助手”框架中的一个。一些出现在脑海中的是MVVM Light、Caliburn等。有关更多信息,请参阅以下链接。