这是关于如何构建MVVM / WPF应用程序的“最佳实践设计”问题。
设想像Photoshop这样的东西,你有一个可以打开多个(标签)文档的编辑器。一个工具箱。每个工具只需设置当前活动文档的属性(如打开过滤器和设置过滤器参数)。我正在使用Actipro的Docking& amp;标签界面的MDI框架。
支持两种类型的文档:称之为DocSimple& DocComplex,DocComplex提供DocSimple的所有可控属性,以及一些额外的属性。
我现在所做的:
问题1 :一般来说,这似乎是一种合理的方法吗?这是我的第一个MVVM应用程序(来自WinForms),&虽然一切都运行正常,但我怀疑是否可以绑定到ActiveDocViewModel.Prop ...但它似乎也是最合乎逻辑的方法,基于这样一个事实:“一个”MainWindow需要绑定到“许多可能的“doc选项卡之一。
问题2 :如上所述,DocComplex提供了比DocSimple更多的属性/选项。我通过继承DocSimpleViewModel中的DocComplexViewModel来处理这个问题。在MainWindowViewModel中创建一个属性,如:
public bool IsComplexToolsVisible
{
get
{
return(ActiveDocViewModel != null && ActiveDocViewModel is DocComplexViewModel);
}
}
这与工具箱的该部分的“可见性”绑定。同样,它按预期工作 - 但每当我们打开DocSimple时,它也会为Complex Tools部分中的每个属性产生“BindingExpression路径错误:'xxx'属性未找到”错误。通过向DocSimple添加“stub”属性来解决这些问题很容易,但这显然是错误的(当我刚刚结束时,使用继承将“复杂”功能添加到“简单”基类型中会是什么意思无论如何为基类中的所有内容添加存根?)。因此,这些绑定错误的存在使我质疑这种方法是否有缺陷 - 以及我如何处理复杂与简单的情况,同时避免所有绑定错误。
非常感谢任何见解:)
答案 0 :(得分:1)
起初,我认为总体结构看起来非常好,但我不是专家,也不想给这样的评价。
然后为您解决绑定错误: 您可以使用TemplateSelector,它为模板提供了简单的工具箱"对于DocSimple类型和不同的模板,其中包含简单的工具箱以及DocComplex的其他部分。