根据另一个 ItemsControl 的选定对象更新 ItemsControl.ItemsSource

Update ItemsControl.ItemsSource based on selected object of a another ItemsControl

我们使用 ReactiveUI 和 DynamicData 并有两个列表框:ListBoxAListBoxB。根据 ListBoxA 的选择,ListBoxB 中的列表应该更新(未过滤)。看起来很简单,但我在刷新 ListBoxB

时遇到了一些问题

列表框在视图中的绑定方式如下:

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

ViewModel:=

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

如有任何帮助,我们将不胜感激!

每次您 select 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();
  }

}