在.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
相关产品推荐
相关产品推荐

