【问题标题】:ReactiveUI: synchronize selected item of ListBox with TextBoxesReactiveUI:将 ListBox 的选定项与 TextBoxes 同步
【发布时间】:2026-02-05 14:40:01
【问题描述】:

在带有 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。它在显示表单时被加载(这个问题不是关于添加/删除人员)。

显示所选人员属性的表单控件的绑定如下所示,我仅显示 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


    【解决方案1】:

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

    默认情况下,绑定的源将在目标更改时更新,相当于在 WPF 绑定上设置 UpdateSourceTrigger = PropertyChanged。

    您可以在PropertyBinderImplementation.cs 中验证这一点

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

    为了传播更改,您应该:

    • 移除事件选择器(回退到默认行为)
    • 验证您具有FirstNameLastName 的通知属性
    • 您提到“ListBox 项目是由名字和姓氏组合而成的。”。使用 ItemTemplate 来执行此操作,因为它会转发更改。

    【讨论】: