Я нашел решение, которое работает. Второй параметр привязки «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