ReactiveUI中如何仅订阅属性链A.B尾端B的变更,排除A变更触发的回调
解决方案
你需要将监听逻辑拆分为先跟踪A实例的变化,再监听对应A实例的B属性变更,同时跳过B属性的初始值,避免A实例替换时触发回调。
调整后的ViewModel构造函数代码
public ViewModel() { this.WhenAnyValue(x => x.A) // 每当A实例变更,切换到新A实例的B属性变更流 .Select(a => { // A为null时返回空流,不触发任何回调 if (a == null) return Observable.Empty<int>(); // 监听当前A的B属性变化,Skip(1)跳过初始值,仅响应后续变更 return a.WhenAnyValue(x => x.B).Skip(1); }) .Switch() .Subscribe(b => Console.WriteLine($"Ping: A = {A.ID}, b = {b}")); }
逻辑说明
- 外层
WhenAnyValue(x => x.A)仅跟踪A实例的替换,每次替换后自动切换到新A实例的B属性监听流,旧A实例的监听会自动释放,不会出现内存泄漏 Skip(1)的作用是忽略首次订阅B属性时拿到的初始值,仅当B属性发生主动修改时才触发回调- 替换A实例时,无论新A的B值和旧A的B值是否相同,都不会触发回调,完全符合需求
运行后预期输出
调整后运行示例代码只会输出两次符合要求的回调:
Ping: A = 1, b = 2 Ping: A = 4, b = 3
内容的提问来源于stack exchange,提问作者Döharrrck
相关产品推荐
相关产品推荐

