CommunityToolkit MVVM如何声明只读属性?
使用CommunityToolkit MVVM实现只读通知属性
核心实现方案
你需要的是外部(视图)只读、内部(ViewModel)可修改、且属性变更时自动通知视图的属性,CommunityToolkit MVVM完全支持这类场景,以下是两种推荐实现方式:
方式一:基于ObservableObject的手动完善实现
你的初始写法缺少属性变更通知逻辑,只需结合ObservableObject基类的SetProperty方法补全即可,工具包完全兼容这种写法:
public class YourViewModel : ObservableObject { private int _myVar; public int MyProperty { get => _myVar; private set => SetProperty(ref _myVar, value); } // 内部修改示例 private void UpdateProperty() { MyProperty = 100; // 内部调用private set,自动触发PropertyChanged通知 } }
SetProperty方法会自动对比新旧值,仅在值变化时更新字段并触发通知,确保视图能感知属性变更。
方式二:使用[ObservableProperty]特性(工具包推荐的简洁写法)
借助[ObservableProperty]特性,工具包会在编译时自动生成属性的getter、setter及变更通知逻辑,通过指定SetterVisibility参数,可直接生成外部只读、内部可写的属性:
using CommunityToolkit.Mvvm.ComponentModel; public partial class YourViewModel : ObservableObject { // 自动生成公共属性MyProperty,其setter为private [ObservableProperty(SetterVisibility = SetterVisibility.Private)] private int _myProperty; // 内部修改示例 private void UpdateProperty() { MyProperty = 200; // 内部可直接赋值,自动触发通知 } }
这种写法无需手动编写属性逻辑,既保证了封装性,又简化了代码量。
关于readonly int MyProperty写法的问题
你尝试的readonly int MyProperty是C#的只读字段而非属性,存在两个核心问题:
- WPF/MAUI等UI框架的数据绑定要求目标是属性(而非字段),否则无法正常工作;
- 只读字段初始化后无法修改,不符合你“内部可修改”的需求。
因此这种写法不适用你的场景。
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

