根据另一个 ItemsControl 的选定对象更新 ItemsControl.ItemsSource
Posted
技术标签:
【中文标题】根据另一个 ItemsControl 的选定对象更新 ItemsControl.ItemsSource【英文标题】:Update ItemsControl.ItemsSource based on selected object of a another ItemsControl 【发布时间】:2021-10-09 15:41:00 【问题描述】:我们使用 ReactiveUI 和 DynamicData 并有两个 ListBox:ListBoxA 和 ListBoxB。基于 ListBoxA 的选择,应该更新 ListBoxB 中的列表(未过滤)。看起来很简单,但我在刷新 ListBoxB
时遇到了一些问题ListBox 在视图中是这样绑定的:
this.OneWayBind(ViewModel, vm => vm.ItemsA, v => v.ListBoxA.ItemsSource).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SelectedItemA, v => v.ListBoxA.SelectedItem).DisposeWith(disposables);
this.OneWayBind(ViewModel, vm => vm.ItemsB, v => v.ListBoxB.ItemsSource).DisposeWith(disposables);
视图模型:=
_storage.PoolA.Connect()
.Transform(m => new ViewModelForA(m))
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(out _itemsA)
.Subscribe();
SelectedItemA.PoolB.Connect()
.Transform(c => new ViewModelForB(c))
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(out _itemsB)
.Subscribe();
任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:每次您在ListBoxA
中选择某些内容时,您的SelectedItemA
对象都会发生变化,您需要重新创建与它的连接。
首先我们从 SelectedItemA 创建一个 IObservable,然后使用 DynamicData 中的 Switch 运算符
class MyViewModel: INotifyPropertyChange
public MyViewModel()
_storage.PoolA.Connect()
...
this.WhenPropertyChanged(x => x.SelectedItemA)
.Select(x => x.Value.PoolB)
.Switch() // Switch from DynamicData
.Transform(c => new ViewModelForB(c))
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(out _itemsB)
.Subscribe();
【讨论】:
以上是关于根据另一个 ItemsControl 的选定对象更新 ItemsControl.ItemsSource的主要内容,如果未能解决你的问题,请参考以下文章
〝WPF〞中的〝ListBox〞、〝ListView〞和〝DataGridView〞有啥区别?