在MVVM中定义从Model到View的属性更改的理想方法是什么?

时间:2016-10-04 20:49:17

标签: c# wpf mvvm inotifypropertychanged field-accessors

我试图重构MVVM架构中的一些代码 模型具有直接更改的公共值。

UI会侦听这些值的更改。

以下是事件信令代码:

public string LoadFilename   { get { return _loadFilename;   } set { _loadFilename   = value; OnPropertyChanged(); } }
public string SaveFilename   { get { return _saveFilename;   } set { _saveFilename   = value; OnPropertyChanged(); } }
public string OneSafFilename { get { return _oneSafFilename; } set { _oneSafFilename = value; OnPropertyChanged(); } }

public bool IsSaveEnabled           { get { return _isSaveEnabled;           } set { _isSaveEnabled           = value; OnPropertyChanged(); } }
public bool IsLoadEnabled           { get { return _isLoadEnabled;           } set { _isLoadEnabled           = value; OnPropertyChanged(); } }
public bool IsLoadCheckpointEnabled { get { return _isLoadCheckpointEnabled; } set { _isLoadCheckpointEnabled = value; OnPropertyChanged(); } }
public bool IsCheckpointEnabled     { get { return _isCheckpointEnabled;     } set { _isCheckpointEnabled     = value; OnPropertyChanged(); } }
public bool IsScenariosEnabled      { get { return _isScenariosEnabled;      } set { _isScenariosEnabled      = value; OnPropertyChanged(); } }

以下是OnPropertyChanged功能:

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

对于MVVM中应该很自然的东西来说,这似乎是很多样板 我想让它更简洁,但我不知道从哪里开始。

如果视图听取了上述属性,那么getter和setter应该是什么样的?

3 个答案:

答案 0 :(得分:3)

实现INPC始终是WPF / XAML的丑陋部分。有了一个很好的基类,它可以减少到{ get { return _loadFilename; } set { Set(ref _loadFilename, value); } }但是它会变得紧凑。 Resharper支持(重构)这个。

顺便说一句,您的代码也缺少优化保护if(value != _loadFilename)。所以BindableBase基类绝对是个好主意。

答案 1 :(得分:2)

您可能希望查看Fody's PropertyChanged之类的内容,它会在构建时重写IL以注入更改通知代码。

答案 2 :(得分:-1)

private type m_name;
    public type name
    {
        get { return m_name; }
        set
        {
            m_name = value;
            if (PropertyChanged != null)
            { PropertyChanged(this, new PropertyChangedEventArgs("name")); }
        }
    }

我使用上面的代码进行需要监听器的属性更改。 type是属性的类型,name是属性的名称(更改'类型'以及' name'在代码中随处可见)

有关MVVM的精彩教程可以解释有关属性更改和代码片段的更多信息,请在youtube上查看Jerry Nixon:https://www.youtube.com/watch?v=cB7KdYPQw1k 它有点过时,但仍然非常有帮助!