Связывание в WinForms, где путь DateMember состоит из нескольких слоев - PullRequest
0 голосов
/ 09 апреля 2020

Обычное связывание прекрасно работает в WinForms, но у меня есть проблема, если в датабере моей привязки есть несколько слоев.

Я связал Text-свойство TextBox со свойством CurrentText моего SubViewModel.

  • Когда свойство "CurrentText" в SubViewModel изменяется, все работает нормально.
  • Когда свойство SubViewModel изменяется, представление реагирует и корректно обновляет свое состояние. Но, к сожалению, привязка к «CurrentText» ведет себя как односторонняя привязка, а не двусторонняя.

Вот моя проблема c привязка:

myTextBox.DataBindings.Add(nameof(myTextBox.Text), MyViewModel, "SubViewModel.CurrentText", true, DataSourceUpdateMode.OnPropertyChanged, null);

I думаю, что проблемной частью c является третий параметр "SubViewModel.CurrentText" .

  • Может кто-нибудь сказать, есть ли ошибка в WinForms для "относительной" привязки (или многослойное связывание)
  • Или я неправильно его использую?

Кстати. Оба свойства (SubViewModel и CurrentText) вызывают "INotifyPropertyChanged", когда вызывается установщик.

Спасибо за усилия!

1 Ответ

0 голосов
/ 14 апреля 2020

Я нашел решение, которое работает. Второй параметр привязки «dataSource» (MyViewModel) должен быть не из какого-либо типа, а из «BindingSource». После переноса MyViewModel в BindingSource все работает нормально.

var bindingSource = new BindingSource(this, nameof(MyViewModel));
myTextBox.DataBindings.Add(nameof(myTextBox.Text), bindingSource, "SubViewModel.CurrentText", true, DataSourceUpdateMode.OnPropertyChanged, null);

Решение работает, но только для одного слоя (например, " SubViewModel.CurrentText "). Если есть третий слой, он не будет работать снова (например, " SubViewModel.SubSubViewModel.CurrentText ").

У кого-нибудь есть идея?

var bindingSource = new BindingSource(this, nameof(MyViewModel));
myTextBox.DataBindings.Add(nameof(myTextBox.Text), bindingSource, "SubViewModel.SubSubViewModel.CurrentText", true, DataSourceUpdateMode.OnPropertyChanged, null);

Обновление от 16-04-2020:

Я решил проблему с помощью специального обходного пути.

Использование BindingSource в качестве DataSource поддерживает привязку двухуровневого пути. Но это страдает для трех или более слоев. Чтобы обнаружить изменения в этом случае я наблюдал, что члены теперь вручную.

Мое решение соблюдает связанные значения на ViewModel. Если какое-либо свойство изменилось, метод ResetBindings вызывается на BindingSource (см. Код MainView ).

Я делюсь своим решением вы в отдельной ветке ( CustomWorkaround ) на github:

https://github.com/Der-Kraken/Kraken.WinFormsBinding/commit/08412e9bc05e6430e4f9624a29b6efe9e98675bd

...