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);
为了传播更改,您应该:
- 删除事件选择器(回退到默认行为)
- 确认您有
FirstName
和 LastName
的通知属性
- 您提到了 "The ListBox items are built from combining first name and last name."。使用
ItemTemplate
来执行此操作,因为它将转发更改。
在带有 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);
为了传播更改,您应该:
- 删除事件选择器(回退到默认行为)
- 确认您有
FirstName
和LastName
的通知属性
- 您提到了 "The ListBox items are built from combining first name and last name."。使用
ItemTemplate
来执行此操作,因为它将转发更改。