在真正的 MVVM 模型中,我们不希望 xaml.cs 中有任何代码隐藏,我们也不希望 viewModel 具有 View 引用。 然而,所有第三方控件都没有为 True MVVM 提供良好的支持。
在我的例子中,我使用的是 Infragistics xamDatagrid 控件,我想将其数据导出到 excel。我可以将数据导出到数据网格的 excel 的唯一方法是使用以下代码:
xamDataGridExcelExporter.xamDataGridExcelExporter xamDataGridExcelExporter1 =
new xamDataGridExcelExporter.xamDataGridExcelExporter();
xamDataGridExcelExporter1.Export(**this.xamDataGrid1**,
@"C:\Excel\ExportFile.xls");
但是,XamDataGridExcelExporter 将输入作为 this.xamDataGrid。 xamDataGrid 是 View 而不是 viewModel 的一部分。 那么我们如何处理这种需要 viewModel 中的 View 实例的情况。
最佳答案
MVVM 禁止代码隐藏是一种常见的误解。事实上,代码隐藏是不可重用的,它与 View 密不可分,因此如果没有自动化就无法进行单元测试。但它确实有其用途。
代码隐藏本质上没有什么不好。事实上,它与您为支持您的 View 而编写的所有其他代码并没有太大区别,例如转换器、自定义控件等。这些代码都不能通过您的 View 模型单元测试进行测试。代码隐藏的唯一区别是它的可重用性较低。但它仍然是您观点的一部分,而且观点还不错。
一般来说,代码隐藏的缺失是 View 和 View 模型之间清晰分离的良好指标。然而,在一个干净的设计中存在一些代码隐藏通常仅仅表明一些事情很难用标准控件和数据绑定(bind)和命令来完成。
在您的情况下,导出 XamDataGrid
绝对是特定于 View 的。它必须与您为 View 选择的第三方库完全相关。因此,完全有道理它不应该是 View 模型的一部分。
如果您仍然坚决反对任何代码隐藏,您可以使用行为,例如ACB或 Blend Behaviors编写您将放入代码隐藏的功能。只需意识到即使是行为也仍然是 View 的一部分,只是比代码隐藏更可重用。
关于c# - 真正的 MVVM 和第三方控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515747/