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