You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动