C#组件Status属性Setter未触发:修改内部属性不调用Refresh
解决Status内部属性修改时触发Refresh的问题
这个问题的核心原因很明确:当你修改StatusClass的内部属性时,Status属性本身的引用并没有发生改变——你只是在操作同一个StatusClass实例里的字段,所以属性的Setter自然不会被调用,Refresh()也就不会触发。只有当你给Status赋值一个全新的StatusClass对象时,引用才会更新,Setter才会执行。
下面是两种常用的解决方案,推荐第一种(符合.NET的MVVM设计规范):
方案一:让StatusClass实现INotifyPropertyChanged接口
通过让StatusClass在内部属性变化时发出通知,组件就能监听这个通知并触发Refresh(),不需要依赖Status属性的Setter。
第一步:改造StatusClass
using System.ComponentModel; using System.Runtime.CompilerServices; public class StatusClass : INotifyPropertyChanged { private int _property1; public int Property1 { get => _property1; set { if (_property1 != value) { _property1 = value; OnPropertyChanged(); } } } // 其他内部属性同理实现 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
第二步:修改组件的Status属性,监听通知
在组件里,我们需要订阅StatusClass实例的PropertyChanged事件,当内部属性变化时自动调用Refresh():
private StatusClass _mStatus = new StatusClass(); public StatusClass Status { get => _mStatus; set { // 先取消旧实例的事件订阅,避免内存泄漏 if (_mStatus != null) { _mStatus.PropertyChanged -= Status_PropertyChanged; } _mStatus = value; // 订阅新实例的事件 if (_mStatus != null) { _mStatus.PropertyChanged += Status_PropertyChanged; } Refresh(); } } // 事件处理方法:当Status内部属性变化时触发Refresh private void Status_PropertyChanged(object sender, PropertyChangedEventArgs e) { Refresh(); } // 组件构造函数里要订阅初始实例的事件 public YourComponent() { _mStatus.PropertyChanged += Status_PropertyChanged; }
这样一来,不管你是给Status赋值新对象,还是修改Status内部的Property1(比如myComponent.Status.Property1 = 3;),都会触发Refresh()方法。
方案二:封装内部属性的修改方法(适合简单场景)
如果StatusClass的结构很简单,你也可以在组件里给每个内部属性单独封装一层,直接在组件的属性Setter里调用Refresh():
public int StatusProperty1 { get => _mStatus.Property1; set { _mStatus.Property1 = value; Refresh(); } }
这种方式虽然直接,但如果StatusClass有很多内部属性,代码会变得冗余,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者hrkad




