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

在.NET MAUI中如何对bool类型使用PropertyChanged检测变化并调用方法?

解决Bool属性变化检测并调用IconUpdater的问题

你误解了PropertyChanged的能力——它完全支持bool类型,当前问题出在静态属性无法触发实例的PropertyChanged事件,且没有在属性变更时手动触发通知。下面给出两种可行方案:


方案一:手动实现INotifyPropertyChanged(实例属性版)

把静态属性改为实例属性,在setter中判断值变化、保存到Preferences、触发通知并调用IconUpdater:

public class Status : INotifyPropertyChanged
{
    private bool _isWorking = Preferences.Get("IsWorking", true);
    private bool _isPaused = Preferences.Get("IsPaused", false);

    public bool IsWorking
    {
        get => _isWorking;
        set
        {
            if (_isWorking != value)
            {
                _isWorking = value;
                Preferences.Set("IsWorking", value);
                OnPropertyChanged(nameof(IsWorking));
                IconUpdater();
            }
        }
    }

    public bool IsPaused
    {
        get => _isPaused;
        set
        {
            if (_isPaused != value)
            {
                _isPaused = value;
                Preferences.Set("IsPaused", value);
                OnPropertyChanged(nameof(IsPaused));
                IconUpdater();
            }
        }
    }

    public void IconUpdater()
    {
        // 你的逻辑代码
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

如果必须保留静态属性,可以改用静态PropertyChanged事件:

public class Status
{
    private static bool _isWorking = Preferences.Get("IsWorking", true);
    private static bool _isPaused = Preferences.Get("IsPaused", false);

    public static bool IsWorking
    {
        get => _isWorking;
        set
        {
            if (_isWorking != value)
            {
                _isWorking = value;
                Preferences.Set("IsWorking", value);
                OnStaticPropertyChanged(nameof(IsWorking));
                IconUpdater();
            }
        }
    }

    public static bool IsPaused
    {
        get => _isPaused;
        set
        {
            if (_isPaused != value)
            {
                _isPaused = value;
                Preferences.Set("IsPaused", value);
                OnStaticPropertyChanged(nameof(IsPaused));
                IconUpdater();
            }
        }
    }

    public static void IconUpdater()
    {
        // 你的逻辑代码
    }

    public static event PropertyChangedEventHandler StaticPropertyChanged;

    protected static void OnStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }
}

方案二:用CommunityToolkit.Mvvm简化实现

先安装CommunityToolkit.Mvvm NuGet包,然后借助ObservableObject基类和特性自动处理通知:

using CommunityToolkit.Mvvm.ComponentModel;

public partial class Status : ObservableObject
{
    [ObservableProperty]
    private bool _isWorking = Preferences.Get("IsWorking", true);

    [ObservableProperty]
    private bool _isPaused = Preferences.Get("IsPaused", false);

    // 属性变化时自动触发的回调方法
    partial void OnIsWorkingChanged(bool value)
    {
        Preferences.Set("IsWorking", value);
        IconUpdater();
    }

    partial void OnIsPausedChanged(bool value)
    {
        Preferences.Set("IsPaused", value);
        IconUpdater();
    }

    public void IconUpdater()
    {
        // 你的逻辑代码
    }
}
  • [ObservableProperty]会自动生成对应的公共属性(如_isWorking生成IsWorking),并自动触发PropertyChanged通知
  • 命名为On[PropertyName]Changed的partial方法会在属性值变化时自动执行,无需手动写setter逻辑

内容的提问来源于stack exchange,提问作者Mielesgames

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:40:39