如何在ReactiveUI中基于两个属性状态触发指定任务?
解决ReactiveUI中监听两个属性状态不生效的问题
你当前的代码未生效的核心原因是:Ch1SW和Ch2SW是普通自动属性,没有实现属性变更通知。ReactiveUI的WhenAnyValue依赖INotifyPropertyChanged事件感知属性变化,普通属性修改时不会触发该事件,导致订阅逻辑永远收不到更新。
解决方案一:使用ReactiveProperty(推荐)
将属性替换为ReactiveUI的ReactiveProperty<bool>,自动处理变更通知:
private readonly ReactiveProperty<bool> _ch1SW = new ReactiveProperty<bool>(); private readonly ReactiveProperty<bool> _ch2SW = new ReactiveProperty<bool>(); public bool Ch1SW { get => _ch1SW.Value; set => _ch1SW.Value = value; } public bool Ch2SW { get => _ch2SW.Value; set => _ch2SW.Value = value; } // 简化后的订阅逻辑 this.WhenAnyValue(x => x.Ch1SW, x => x.Ch2SW) .Where(tuple => tuple.Item1 && !tuple.Item2) .ObserveOn(RxApp.MainThreadScheduler) .AsyncSubscribe(async x => { // 执行你的异步任务 });
解决方案二:继承ReactiveObject手动触发变更
让ViewModel继承ReactiveObject,在属性setter中用RaiseAndSetIfChanged触发通知:
public class YourViewModel : ReactiveObject { private bool _ch1SW; private bool _ch2SW; public bool Ch1SW { get => _ch1SW; set => this.RaiseAndSetIfChanged(ref _ch1SW, value); } public bool Ch2SW { get => _ch2SW; set => this.RaiseAndSetIfChanged(ref _ch2SW, value); } public YourViewModel() { this.WhenAnyValue(x => x.Ch1SW, x => x.Ch2SW, (sw1, sw2) => (sw1, sw2)) .Where(sw => sw.sw1 && !sw.sw2) .ObserveOn(RxApp.MainThreadScheduler) .AsyncSubscribe(async x => { // 执行你的异步任务 }); } }
额外注意事项
- 避免在
Subscribe中直接使用async void,推荐用ReactiveUI提供的AsyncSubscribe,它能更好地处理异步任务中的异常。 - 确保ViewModel正确继承
ReactiveObject(方案二)或使用ReactiveProperty(方案一),这是ReactiveUI监听属性变化的基础。
内容的提问来源于stack exchange,提问作者playground
相关产品推荐
相关产品推荐

