WPF MVVM Community Toolkit:如何简化ViewModel关联Model的属性写法
使用MVVM Community Toolkit简化ViewModel代理属性的写法
当然有更简洁的方式,MVVM Community Toolkit提供的SetProperty方法可以帮你大幅简化重复代码,同时保留原有逻辑:
简化后的ViewModel示例
public class TheViewModel : ObservableObject { private readonly TheModel _theModel; public bool FirstProp { get => _theModel.FirstProp; set => SetProperty(ref _theModel.FirstProp, value); } public int SecondProp { get => _theModel.SecondProp; set => SetProperty(ref _theModel.SecondProp, value); } public TheViewModel(TheModel theModel) { _theModel = theModel; } }
关键说明
SetProperty是ObservableObject基类提供的方法,它会自动完成值比较、赋值和触发PropertyChanged事件这三个步骤,完全替代你原来手动编写的if判断和OnPropertyChanged()调用。- 这种写法和你原来的逻辑完全一致,但代码量减少了一半以上,属性越多,简化效果越明显。
进阶优化(若允许修改Model)
如果可以修改你的TheModel类,让它继承ObservableObject并实现属性通知:
public class TheModel : ObservableObject { private bool _firstProp; public bool FirstProp { get => _firstProp; set => SetProperty(ref _firstProp, value); } private int _secondProp; public int SecondProp { get => _secondProp; set => SetProperty(ref _secondProp, value); } }
此时ViewModel可以监听Model的属性变更事件,自动转发通知,进一步简化:
public class TheViewModel : ObservableObject { public TheModel TheModel { get; } public bool FirstProp => TheModel.FirstProp; public int SecondProp => TheModel.SecondProp; public TheViewModel(TheModel theModel) { TheModel = theModel; TheModel.PropertyChanged += OnModelPropertyChanged; } private void OnModelPropertyChanged(object? sender, PropertyChangedEventArgs e) { // 当Model的属性变化时,触发ViewModel对应属性的通知 OnPropertyChanged(e.PropertyName); } // 记得在ViewModel销毁时解绑事件,避免内存泄漏 ~TheViewModel() { TheModel.PropertyChanged -= OnModelPropertyChanged; } }
这种方式下,ViewModel的属性只需要写getter,所有变更通知都通过事件转发完成,代码更加简洁。
内容的提问来源于stack exchange,提问作者bighunter
相关产品推荐
相关产品推荐

