我经常使用WPF将数据网格绑定到IEditableObject的集合。几乎每次我这样做时,我都会后悔。有没有潜规则可以避免在我的视图模型中完全实现 IEditableObject ?
我注意到的最新问题是内存泄漏。一些关键的内部组件(DataBindEngine,CommitManager,BindingGroup)正在一起协调根内存引用。如果用户在意外的时刻关闭数据输入窗口(例如,在BeginEdit之后,如果用户从不进行触发“ CancelEdit”或“ CommitEdit”的调用的操作),这似乎正在发生。扎根发生在数据绑定引擎中非常隐蔽的地方,似乎很难控制该级别的默认行为(除了确保我没有在我的任何人中实现 IEditableObject 视图模型)。
不幸的是,避免IEditableObject实现并不总是那么容易。例如,当绑定到ADO.Net时,数据网格希望对单个记录使用BindingListCollectionView(用于集合)和DataRowView类。由于DataRowView类实现了IEditableObject,因此似乎没有任何方法可以轻松地放弃相关的错误。我希望有一种方法可以告诉WPF数据网格忽略 IEditableObject的实现,并假装未实现。
总的来说,我想知道是否应该避免绑定到IEditableObject(并且根据该规则,我们也应该避免直接绑定到ADO.Net)。这样做似乎有很多陷阱,而且我听说WPF开发人员正在贬低ADO.Net。但是我从未见过Microsoft在此问题上提供任何正式或权威性的指导。
PS。除了我的数据绑定中的内存泄漏之外,这里还有一些其他示例,它们说明了绑定到IEditableObject时可能遇到的各种类型的问题。
WPF DataGrid calls BeginEdit on an IEditableObject two times?
潜在的修正(用户语音提示): 理想情况下,WPF数据网格将具有允许我们禁用IEditableObject的所有专门处理的属性。无论视图模型是否实现了该接口,这都将允许数据网格以一致的方式工作。我发现了有关在数据网格中使BindingGroup功能“可选”的用户声音想法。我想这可能是解决方案的一部分,但是这个想法被拒绝了。 https://wpdev.uservoice.com/forums/427690-windows-presentation-foundation-wpf/suggestions/6736492-make-internal-use-of-bindinggroup-in-datagrid-opti