是否需改写Model移除INotifyPropertyChanged并在ViewModel实现?
结论很明确:不需要改写库生成的Model类,理由和具体做法如下:
Firely的Model实现INotifyPropertyChanged是合理设计
FHIR资源本身是核心业务数据,库给Model添加变更通知,是为了适配C# GUI开发中数据绑定的需求——不管是直接绑定还是通过ViewModel中转,都能实时响应数据变化。这完全符合MVVM的设计思路,并非必须把INotifyPropertyChanged限定在ViewModel里,MVVM的核心是分离UI逻辑和业务数据,Model具备通知能力只是让数据本身更易用,不违反原则。改写自动生成的类会带来维护问题
你贴的Patient是partial类,大概率是Firely代码生成工具自动生成的。手动修改这类代码,下次重新生成时你的改动会被直接覆盖;而且强行移除INotifyPropertyChanged可能破坏库的其他内置功能,比如资源的变更跟踪、序列化逻辑,得不偿失。正确的做法:ViewModel封装Model,利用现有通知能力
ViewModel依然承担UI逻辑、数据转换、业务规则的职责,同时可以直接监听Model的PropertyChanged事件,同步更新ViewModel的属性,示例代码如下:public class PatientViewModel : INotifyPropertyChanged { private readonly Patient _patient; public PatientViewModel(Patient patient) { _patient = patient; _patient.PropertyChanged += Patient_PropertyChanged; } // 给UI的友好属性,对Patient的原始属性做包装 public string OrganizationDisplay { get => _patient.Organization?.Display ?? "无关联机构"; set { if (_patient.Organization == null) _patient.Organization = new ResourceReference(); if (_patient.Organization.Display != value) { _patient.Organization.Display = value; OnPropertyChanged(nameof(OrganizationDisplay)); } } } private void Patient_PropertyChanged(object sender, PropertyChangedEventArgs e) { // 当Patient的属性变化时,同步触发ViewModel对应属性的通知 if (e.PropertyName == nameof(Patient.Organization)) { OnPropertyChanged(nameof(OrganizationDisplay)); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }灵活理解MVVM,不必拘泥于刻板规则
很多时候我们说ViewModel负责变更通知,是因为常见的Model是纯POCO(比如数据库实体),没有通知能力。但如果Model本身已经具备完善的变更通知(像Firely的FHIR资源),直接利用这个特性可以减少ViewModel的重复代码,同时保持UI逻辑和业务数据的分离,这才是MVVM的核心目的。
内容的提问来源于stack exchange,提问作者Berhe Birhane

