Zip 未按预期运行
Zip does not behave as expected
在我的最新项目中,我决定测试响应式编程世界提供的一些功能。
由于它是一个 C# 项目,我已经开始使用 System.Reactive 和 ReactiveProperty nuget 包。
在我的项目中,我尝试通过以下代码组合绑定到 WPF 文本框控件的 2 个属性:
public ReactiveProperty<string> InputFieldFirst { get; set; }
public ReactiveProperty<string> InputFieldSecond { get; set; }
public ReactiveProperty<string> RxTest { get; set; }
public MainViewModel()
{
InputFieldFirst = new ReactiveProperty<string>("Demo");
InputFieldSecond = new ReactiveProperty<string>("Test");
RxTest = InputFieldFirst.Zip(InputFieldSecond, CombineStrings).Delay(TimeSpan.FromMilliseconds(500)).ToReactiveProperty();
}
private string CombineStrings(string a, string b)
{
return $"{a} {b}";
}
绑定到 RxTest 的文本框获得 "Demo Test" 的初始值 - 但是当我编辑绑定到 InputFieldFirst 或 InputFieldSecond 的文本框的内容时,没有触发更新。
当我如下更改代码时,所有对 InputFieldFirst 的更新都是可见的,如预期的那样在 RxTest 中延迟。
public MainViewModel(IReactiveRepository<DemoContent> repo)
{
InputFieldFirst = new ReactiveProperty<string>("Demo");
InputFieldSecond = new ReactiveProperty<string>("Test");
RxTest = InputFieldFirst.Delay(TimeSpan.FromMilliseconds(500)).ToReactiveProperty();
}
任何关于如何设置 .Zip() 的提示都会非常好。
完成更新
XAML 文本框代码
<Grid>
<StackPanel>
<TextBox Text="{Binding InputFieldFirst.Value, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBox Text="{Binding InputFieldSecond.Value, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBox Text="{Binding RxTest.Value}"></TextBox>
</StackPanel>
</Grid>
我认为您想使用 CombineLatest
而不是 Zip
。 Zip
像拉链一样工作:将 Stream1 的第 n 条消息与 Stream2 的第 n 条消息匹配。
示例:
Stream1: A----B-----C----D--E-
Stream2: 1-2-3----4---5-6--7--
Zip : A1---B2----C3---D4-E5
数字输出得更快并不重要:Zip 始终将第一个数字与第一个字母匹配,将第二个数字与第二个字母匹配,依此类推。
在我的最新项目中,我决定测试响应式编程世界提供的一些功能。 由于它是一个 C# 项目,我已经开始使用 System.Reactive 和 ReactiveProperty nuget 包。 在我的项目中,我尝试通过以下代码组合绑定到 WPF 文本框控件的 2 个属性:
public ReactiveProperty<string> InputFieldFirst { get; set; }
public ReactiveProperty<string> InputFieldSecond { get; set; }
public ReactiveProperty<string> RxTest { get; set; }
public MainViewModel()
{
InputFieldFirst = new ReactiveProperty<string>("Demo");
InputFieldSecond = new ReactiveProperty<string>("Test");
RxTest = InputFieldFirst.Zip(InputFieldSecond, CombineStrings).Delay(TimeSpan.FromMilliseconds(500)).ToReactiveProperty();
}
private string CombineStrings(string a, string b)
{
return $"{a} {b}";
}
绑定到 RxTest 的文本框获得 "Demo Test" 的初始值 - 但是当我编辑绑定到 InputFieldFirst 或 InputFieldSecond 的文本框的内容时,没有触发更新。
当我如下更改代码时,所有对 InputFieldFirst 的更新都是可见的,如预期的那样在 RxTest 中延迟。
public MainViewModel(IReactiveRepository<DemoContent> repo)
{
InputFieldFirst = new ReactiveProperty<string>("Demo");
InputFieldSecond = new ReactiveProperty<string>("Test");
RxTest = InputFieldFirst.Delay(TimeSpan.FromMilliseconds(500)).ToReactiveProperty();
}
任何关于如何设置 .Zip() 的提示都会非常好。
完成更新
XAML 文本框代码
<Grid>
<StackPanel>
<TextBox Text="{Binding InputFieldFirst.Value, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBox Text="{Binding InputFieldSecond.Value, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBox Text="{Binding RxTest.Value}"></TextBox>
</StackPanel>
</Grid>
我认为您想使用 CombineLatest
而不是 Zip
。 Zip
像拉链一样工作:将 Stream1 的第 n 条消息与 Stream2 的第 n 条消息匹配。
示例:
Stream1: A----B-----C----D--E-
Stream2: 1-2-3----4---5-6--7--
Zip : A1---B2----C3---D4-E5
数字输出得更快并不重要:Zip 始终将第一个数字与第一个字母匹配,将第二个数字与第二个字母匹配,依此类推。