wpf - 复合类中的 C++/CLI DLL 和 ObservableCollections

标签 wpf mvvm c++-cli observablecollection

我正在实现一个 C++/CLI 类库,它执行一些与设备相关的低级工作并公开一些托管类。这个库即将被一些 C# WPF 项目使用。

其中一个类(称为 CalibrationRecord)包含一些公共(public)属性,其中一些是集合,目前实现为通用列表。 WPF 项目之一必须能够编辑这些集合(即实现 CRUD 操作)。

我很困惑是否会更好:

A. 将这些集合实现为 ObservableCollections,并能够直接从 WPF 绑定(bind)中使用它们

B. 在客户端应用程序/另一个DLL中添加另一个层并将CalibrationRecord包装在ObservableCalibrationRecord中,其中集合是ObservableCollections,属性实现INotifyPropertyChanged

我认为 B 是一个“更干净”的解决方案,因为这样我的类库不知道 WPF 相关的接口(interface)和类,但是,实现这一层还有很多额外的工作,而且它只是简单无聊的样板代码,所以 A 看起来很诱人。

您会推荐哪种解决方案?或者,也许我错过了一些更简单的解决方案?

最佳答案

个人轶事/意见只在这里 - 但我也推荐选项 B。您的模型对象中的 ObservableCollection 可能是矫枉过正 - ObservableCollection 可以引发许多您可能不需要的通知(因为当时可能无法查看该集合)并且似乎使您的 UI 代码模糊了业务代码。

我在使用与您的选项 B 类似的设置时遇到的一个问题,其中数据存储在 List 和 ObservableCollection 中,是您是否想要 ObservableCollection 中的 List 数据副本或实际模型数据对象本身。显然,如果您在 ObservableCollection 中有实际数据,那么当用户更新模型对象时,它将反射(reflect)在您的列表中;但是,您可能会遇到一些设计约束,其中 Model 对象需要 NotifyPropertyChanged 处理等 - 这可能会破坏将两者分开的某些目的。否则,您必须获取 ObservableCollection 中的对象并将它们同步回列表。

我最终选择了同步方法,尽管当用户完成编辑后这需要一些额外的工作。最终,两者的分离使UI编辑代码与业务操作代码/对象划定,这是值得的。

关于wpf - 复合类中的 C++/CLI DLL 和 ObservableCollections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616101/

相关文章:

c# - 为自定义 ShaderEffect 创建黑色滤镜

wpf - 在WPF中打印多页

c# - MVVM:如何将ObservableCollection传递给其他 View 模型?

c# - 在 C# 字节数组和 C++ 字节数组之间编码

WPF 文本换行与 WrapWithOverflow

c# - 使 WPF Listview 遵循 Windows 主题

c# - WPF MVVM : Binding a different ViewModel to each TabItem?

c++ - 使用 BeginInvoke 时出现参数计数不匹配异常

c# - 错误 LNK2028 : Thrown when instantiating an native C++ class within C++/CLI

wpf - 如果无法将 'String'类型的值添加到 'UIElementCollection'类型的集合或字典中,则停止构建