ReactiveUI: синхронизировать выбранный элемент ListBox с TextBoxes - PullRequest
1 голос
/ 11 февраля 2020

В приложении MVVM с ReactiveUI: у меня есть простая форма редактора для некоторых объектов, скажем, Persons. С левой стороны у меня есть ListBox, который показывает всех доступных людей. На правой стороне у меня есть форма, которая показывает свойства выбранного человека. Мои привязки в коде выглядят так:

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 строятся из сочетания имени и фамилии. Чего я хотел бы добиться, так это автоматически обновлять выбранный элемент ListBoxs, пока пользователь вводит данные в поля формы. (Думаю, мне придется избавиться от селекторов событий LostKeyboardFocus, но это все равно не приведет к автоматическому обновлению c).

Есть идеи, как этого добиться?

1 Ответ

1 голос
/ 11 февраля 2020

Из документации ReactiveUI: Выбор времени обновления источника

По умолчанию источник привязки будет обновляться при изменении цели, что эквивалентно установке UpdateSourceTrigger = PropertyChanged для привязки WPF.

Вы можете проверить это в PropertyBinderImplementation.cs

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

Чтобы распространить изменения, вы должны:

  • Удалите селектор событий (вернитесь к поведению по умолчанию)
  • Убедитесь, что у вас есть уведомляющие свойства для FirstName и LastName
  • Вы упомянули " Элементы ListBox построены из сочетания имени и фамилии. ". Для этого используйте ItemTemplate, так как он перенаправит изменения.
...