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

是否需改写Model移除INotifyPropertyChanged并在ViewModel实现?

要不要改写Firely FHIR库的Model类移除INotifyPropertyChanged?

结论很明确:不需要改写库生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:39:54