ReactiveUI CombineLatest 不触发 Func

ReactiveUI CombineLatest not trigger Func

我在 WPF 中使用 ReactiveUI。我将一个 ListBox.ItemSource 绑定到我的 ViewModel.FileList.

下面的 Observable.CombinedLatest() 不会触发 Func。 但是上面的单个 Observable 触发了它的 Func.

我想使用组合可观察的原因是: 我想在第一次加载时显示数据列表 - 这是由 ConvertedMessage 属性 值更改触发的。

然后当用户在搜索文本框中输入单词时,我还需要显示不同的列表,它们实际上更新相同的数据绑定源列表。

我还尝试了两个不同的单独可观察对象,Observable.SelectMany(MyMethod) 中的两个单独方法,但似乎第二个可观察对象覆盖了前一个 - 因为只有最后一个 observable.MyMethod 被调用。

对于ReactiveUI有什么想法或建议吗CombinedLatest(),是不是只有当所有的observables产生元素时才触发函数?

this.WhenAnyValue(x => x.ConvertedMessage).Where(x=>x!=null).Subscribe(x => { var msg = x.Message; });

        var initial =
            this                
            .WhenAnyValue(x => x.ConvertedMessage)
            .Where(x=>x!=null);

        var searchObjs =
            this
            .WhenAnyValue(x => x.SearchText)
            .Throttle(TimeSpan.FromMilliseconds(800))
            .Select(term => term)
            .DistinctUntilChanged()
            .Where(term => !string.IsNullOrEmpty(term));

        reviewFiles = Observable.CombineLatest(initial, searchObjs, (message, term) => {
            ObservableCollection<PrecedentFile> loadedFiles = new ObservableCollection<PrecedentFile>();

            var start = 0;
            CurrentPage = 1;
            if (!string.IsNullOrEmpty(term))
            {
                //some logic
                return searchedResults;
            }
            else
            {
                //other logic

                return loadedFiles.AsEnumerable<PrecedentFile>();
            }

        }).Select(x=>x)
            .ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.ReviewFiles);

我相信您面临的问题是 CombineLatest 需要传递给它的所有 observables 至少有 event/signals 至少发生一次。

在上面的示例中,如果 initial 有触发器但 searchObs 没有,则 CombineLatest 不会触发。

例如,您已经更改了 3 次 ConvertedMessage,但从未更改过 SearchText,那么 CombineLatest 将不会触发。

您可以做的一件事是删除 .Where(x => x != null)Where(term => !string.IsNullOrEmpty(term)) 语句并在您的 CombineLatest lambda 中处理这些条件。 WhenAnyValue() 将是默认信号,具有您的属性的初始值(通常为空)。这样双方都已经表明了价值。