【发布时间】:2016-10-04 20:49:16
【问题描述】:
我正在尝试重构 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 应该是什么样的?
【问题讨论】:
-
我完全同意@HenkHolterman,您可以将 INPC 实现移到基类中。这是我之前使用过的一个小例子stackoverflow.com/questions/33801100/…
-
首先,不要忘记减少 derp 的语言特性 (
PropertyChanged?.Invoke(...)) 其次,有很多方法可以改善这种情况,从 T4 模板生成样板,使用类型描述符,包装您在 IDynamicMetaObjectProviders 等中的 POCO。
标签: c# wpf mvvm inotifypropertychanged field-accessors