ReactiveUI:将列表框的选定项与文本框同步

ReactiveUI: synchronize selected item of ListBox with TextBoxes

在带有 ReactiveUI 的 MVVM 应用程序中: 我有一些实体的简单编辑器表单,比如 Persons。在左侧,我有一个显示所有可用人员的列表框。在右侧,我有一个显示所选人员属性的表格。我的代码内绑定如下所示:

this.OneWayBind(this.ViewModel, x => x.Persons, x => x.LBPersons.ItemsSource).DisposeWith(disposables);
this.Bind(this.ViewModel, x => x.SelectedPerson, x => x.LBPersons.SelectedItem).DisposeWith(disposables);

请注意,Person 是一个简单的 List 而不是 ObservableCollection。它会在显示表格时加载(这个问题与 adding/deleting 人无关)。

显示所选人员属性的表单控件的绑定如下所示,我仅以 FirstName 和 LastName 为例:

this.Bind(this.ViewModel, x => x.SelectedPerson.FirstName, x => x.TBFirstName.Text, TBFirstName.Events().LostKeyboardFocus).DisposeWith(disposables);               

this.Bind(this.ViewModel, x => x.SelectedPerson.LastName, x => x.TBLastName.Text, TBLastName.Events().LostKeyboardFocus).DisposeWith(disposables);

ListBox 项目是通过组合名字和姓氏构建的。我想要实现的是,当用户在表单字段中键入内容时,自动更新列表框的选定项。 (我想我将不得不摆脱 LostKeyboardFocus 事件选择器,但这仍然不会导致自动更新)。

知道如何实现吗?

来自 ReactiveUI 文档:Choosing when to update the source

By default, the source of a binding will be updated when the target changes, which is equivalent to setting UpdateSourceTrigger = PropertyChanged on a WPF binding.

您可以在 PropertyBinderImplementation.cs

中验证
var signalObservable = signalViewUpdate != null
         ? signalViewUpdate.Select(_ => false)
         : view.WhenAnyDynamic(viewExpression, x => (TVProp)x.Value).Select(_ => false);

为了传播更改,您应该:

  • 删除事件选择器(回退到默认行为)
  • 确认您有 FirstNameLastName
  • 的通知属性
  • 您提到了 "The ListBox items are built from combining first name and last name."。使用 ItemTemplate 来执行此操作,因为它将转发更改。