You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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#的只读字段而非属性,存在两个核心问题:

  1. WPF/MAUI等UI框架的数据绑定要求目标是属性(而非字段),否则无法正常工作;
  2. 只读字段初始化后无法修改,不符合你“内部可修改”的需求。
    因此这种写法不适用你的场景。

内容的提问来源于stack exchange,提问作者Álvaro García

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:56:14