ReactiveUI CombineПоследний не вызывает Func - PullRequest
0 голосов
/ 24 января 2020

Я использую ReactiveUI в WPF. Я привязываю один ListBox.ItemSource к своему ViewModel.FileList.

. Нижеприведенный Observable.CombinedLatest() не вызывает Fun c. Но вышеприведенный одиночный триггер Observable имеет свой Fun c.

. Я хочу использовать комбинированную наблюдаемую причину: я хотел бы отобразить список данных при первой загрузке - это вызвано свойством ConvertedMessage значение изменилось.

Затем мне также нужно отобразить другой список, когда пользователь вводит слова в текстовое поле поиска, оба они фактически обновляют один и тот же список источников DataBinding.

Я также пробовал две разные отдельные наблюдаемые два отдельных метода в Observable.SelectMany(MyMethod), но, кажется, вторая наблюдаемая переопределяет предыдущий - потому что вызывается только последний observable.MyMethod.

Есть ли какая-либо идея или предложение относительно ReactiveUI CombinedLatest(), верно? только вызвать функцию, когда все наблюдаемые производят элемент?

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);

1 Ответ

0 голосов
/ 24 января 2020

Я полагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что CombineLatest требует, чтобы все наблюдаемые, передаваемые в нее, имели, по крайней мере, событие / сигналы, по крайней мере, один раз.

В приведенном выше примере, если initial имеет триггер, но searchObs не срабатывает, тогда CombineLatest не сработает.

Например, если у вас было ConvertedMessage, было изменено 3 раза, но SearchText никогда не менялся, тогда CombineLatest не будет срабатывать.

Одна вещь, которую вы можете сделать, это удалить операторы .Where(x => x != null) и Where(term => !string.IsNullOrEmpty(term)) и обработать эти условия в вашей лямбде CombineLatest. WhenAnyValue() будет сигналом по умолчанию с начальным значением ваших свойств (которое часто равно нулю). Таким образом, обе стороны уже получили значение.

...