在 WinForms 中绑定,其中日期成员的路径具有多个层



Common绑定在WinForms中运行良好,但如果绑定的数据成员有多层,则会出现问题。

我将TextBox的Text属性绑定到我的SubViewModel的属性"CurrentText"。

  • 当SubViewModel上的属性"CurrentText"发生更改时,一切都正常
  • 当属性"SubViewModel"发生更改时,视图会做出反应并正确更新其状态。但遗憾的是,与"CurrentText"的绑定表现得像"单向"绑定,而不是双向绑定

这是我有问题的绑定:

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

我认为有问题的部分是第三个参数"SubViewModel.CurrentText">.

  • 有人能说WinForms中是否存在"相对"绑定(或多层绑定(的错误吗
  • 还是我用错了

顺便说一句。调用setter时,两个属性(SubViewModel和CurrentText(都会引发"INotifyPropertyChanged">

谢谢你的努力!

我找到了一个有效的解决方案。第二个绑定参数"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);

2020年4月16日更新:

我现在用自定义的变通方法解决了这个问题。

使用BindingSource作为DataSource支持两层路径绑定。但它会受到三层或三层以上的影响。为了检测这种情况下的变化,我现在手动观察成员。

我的解决方案观察ViewModel上的绑定值。如果任何属性已更改,则会在BindingSource上调用方法ResetBindings(请参阅MainView的代码(。

我在github:上的一个单独分支(CustomWorkaround(中与您分享我的解决方法

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

最新更新