C# Community Toolkit Mvvm Source Generator:如何使用ObservableProperty属性自动化实现属性
嘿,我来帮你搞定这个问题!要想用CommunityToolkit.Mvvm的ObservableProperty替代你手动实现的Year属性(同时保持和_item.Year的绑定逻辑),可以按照以下步骤修改代码:
核心思路
ObservableProperty通过源代码生成自动帮我们实现属性的变更通知逻辑,我们只需要配合它生成的回调方法,把属性的变更同步到_item.Year,同时确保初始值和_item保持一致就行。
修改后的完整代码
using CommunityToolkit.Mvvm.ComponentModel; public partial class InfoViewModel : BaseViewModel { private readonly A.Info _item; public InfoViewModel(A.Info item) { _item = item; // 初始化生成的私有字段,和_item.Year保持同步 _year = _item.Year; } public InfoViewModel() { _item = new A.DateInfo(); _year = _item.Year; } // 用ObservableProperty标记私有字段,自动生成Year属性和通知逻辑 [ObservableProperty] private string? _year; // 利用源代码生成的partial回调方法,在Year属性变更时同步到_item.Year partial void OnYearChanged(string? oldValue, string? newValue) { if (oldValue != newValue) { _item.Year = newValue; } } }
关键细节说明
- 必须保留partial类:
InfoViewModel的partial修饰符是源代码生成的前提,你的代码已经满足这一点,不用改。 - 标记私有字段生成属性:给
_year字段加上[ObservableProperty]特性后,工具会自动生成公共的Year属性,并且内置了INotifyPropertyChanged的通知逻辑,不用你手动写OnPropertyChanged了。 - 同步变更到_item:重写生成的
OnYearChangedpartial方法,这个方法会在Year属性值变化时自动触发,我们在这里把新值同步给_item.Year,保证两者数据一致。 - 初始化同步:在构造函数里把
_year初始化为_item.Year,确保ViewModel刚创建时,Year属性的值和_item里的一致。
额外优化(可选)
如果你的A.Info类本身实现了INotifyPropertyChanged,而且_item.Year可能被ViewModel外部的代码修改,那可以订阅_item的属性变更事件,实现双向同步:
public InfoViewModel(A.Info item) { _item = item; _year = _item.Year; // 订阅_item的PropertyChanged事件,当它的Year变化时同步到ViewModel _item.PropertyChanged += (sender, e) => { if (e.PropertyName == nameof(A.Info.Year)) { _year = _item.Year; } }; }
内容的提问来源于stack exchange,提问作者values_wh




