gpt4 book ai didi

wpf - 如何组合多个 IObservable 形成复合 bool 订阅值

转载 作者:行者123 更新时间:2023-12-04 20:56:27 25 4
gpt4 key购买 nike

我想为 WPF 创建一种基于 Rx 的 ICommand。我想做的是能够通过组合任意数量的 IObservable 流来控制 CanExecute。

我想要的工作方式是,我想使用所有谓词的最新组合逻辑 ANDed 值,并使用它来控制 bool ICommand.CanExecute(object parameter) 方法的实现。我不想等待所有谓词产生,它应该使用任何一个源谓词流 OnNexts(产生一个值)。

我在尝试找出如何将其连接起来以使任何谓词都应导致 ICommand.CanExecute 产生新值时遇到了一些困难。

暂时忘记实际的 ICommand 实现(因为我的问题更多是关于事物的 Rx 方面),任何人都可以建议我如何连接一堆谓词( IObservable ),只要底层事物创建他们的流更改,但也将协同工作以创建我也可以订阅的总体最终 bool 值。最终值将是当前谓词流值的逻辑与。

我希望我不需要订阅所有谓词流,并希望 RX 中有一个我可能忽略的很酷的运算符。

我知道我可以合并流,但这不是我所追求的行为,因为那只是来自已合并的输入流的最新值,我也知道我可以合并最新,这又不完全是正确,因为它只会在所有组合流产生值时产生。

我想要的是要组合的流,这样任何更改都会通知订阅者,但我也想知道组合谓词 IObservable 流的逻辑与现在是什么,这样我就可以驱动 ICommand .CanExecute 从这个整体组合值。

我希望这是有道理的。

这是一些框架代码(我留下了一些注释掉的代码,这些代码显示了我的 Rx 命令想法背后的想法,因为它可能有助于说明我想要开始工作的内容)

public class ViewModel : INPCBase
{
private string title;
private bool hasStuff;

public ViewModel()
{
//Initialise some command with 1st predicate, and
// initial CanExecute value
//SomeCommand = new ReactiveCommand(
// this.ObserveProperty(x => x.Title)
// .Select(x => !string.IsNullOrEmpty(x)), false);
//SomeCommand.AddPredicate(this.ObserveProperty(x => x.HasStuff));
//SomeCommand.CommandExecutedStream.Subscribe(x =>
// {
// MessageBox.Show("Command Running");
// });

IObservable<bool> obsPred = this.ObserveProperty(x => x.Title)
.Select(x => !string.IsNullOrEmpty(x))
.StartWith(!string.IsNullOrEmpty(this.Title));
IObservable<bool> obsPred2 = this.ObserveProperty(x =>
x.HasStuff).StartWith(this.HasStuff);


obsPred.Merge(obsPred2).Subscribe(x =>
{
//How do I get this to fire whenever obsPred OR
//obsPred2 fire OnNext, but also get a combined value (bool)
//of the AND of obsPred & obsPred2 (bearing in mind I may
//want more than 2 predicates, it should cope with any number of
//IObservable<bool> predicates
});
}

public string Title
{
get
{
return this.title;
}
set
{
RaiseAndSetIfChanged(ref this.title, value, () => Title);
}
}


public bool HasStuff
{
get
{
return this.hasStuff;
}
set
{
RaiseAndSetIfChanged(ref this.hasStuff, value, () => HasStuff);
}
}

}

最佳答案

您正在寻找 CombineLatest 运算符

ISubject<bool> obsPred  = new BehaviorSubject<bool>(false);
ISubject<bool> obsPred2 = new BehaviorSubject<bool>(false);

Observable.CombineLatest(obsPred, obsPred2, (a, b)=>a&&b)
.DistinctUntilChanged()
.Dump();

obsPred.OnNext(true);
obsPred2.OnNext(true);
obsPred2.OnNext(true);
obsPred.OnNext(true);

obsPred.OnNext(false);

这将输出

False
True
False

使用 DistinctUntilChanged() 将停止返回重复的连续值。

显然,将 BehaviorSubject 换成您的属性可观察对象。

关于wpf - 如何组合多个 IObservable<bool> 形成复合 bool 订阅值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com