我试图重构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应该是什么样的?
答案 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 它有点过时,但仍然非常有帮助!