0

我正在尝试重构 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 应该是什么样子?

4

3 回答 3

3

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

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

于 2016-10-04T20:54:39.920 回答
2

您可能想查看Fody 的 PropertyChanged 之类的东西,它在构建时重写 IL 以注入更改通知代码。

于 2016-10-04T20:59:24.193 回答
-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 是属性的名称(在代码中的任何位置更改“类型”和“名称”)

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

于 2016-10-04T21:12:50.970 回答