根据另一个 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:ListBoxAListBoxB。基于 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〞有啥区别?

WPF中的ListBox,ListView和DataGridView有啥区别

ItemsControl - 网格子元素自动调整大小

如何根据另一个的选定项目过滤一个组合框集合?

根据另一个选定的行和列部分更新数据框

在ItemsControl中更紧密的项目