Zip的行为不符合预期

时间:2018-03-16 14:21:59

标签: c# wpf rx.net reactive-property

在我的最新项目中,我决定测试一些反应式编程提供的功能。 由于它是一个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的文本框获取&#34; Demo Test&#34;的初始值。 - 但是当我编辑绑定到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>

1 个答案:

答案 0 :(得分:2)

我认为您要使用CombineLatest代替ZipZip的工作方式类似于拉链:将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始终将第一个数字与第一个字母匹配,第二个数字与第二个字母相匹配等。