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()
将是默认信号,具有您的属性的初始值(通常为空)。这样双方都已经表明了价值。
我在 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()
将是默认信号,具有您的属性的初始值(通常为空)。这样双方都已经表明了价值。