WPF / MVVM标签设计&避免绑定错误

时间:2016-12-29 23:02:16

标签: c# wpf mvvm binding mdi

这是关于如何构建MVVM / WPF应用程序的“最佳实践设计”问题。

设想像Photoshop这样的东西,你有一个可以打开多个(标签)文档的编辑器。一个工具箱。每个工具只需设置当前活动文档的属性(如打开过滤器和设置过滤器参数)。我正在使用Actipro的Docking& amp;标签界面的MDI框架。

支持两种类型的文档:称之为DocSimple& DocComplex,DocComplex提供DocSimple的所有可控属性,以及一些额外的属性。

我现在所做的:

  • MainWindow.xaml&整个应用程序的MainWindowViewModel(包含对接容器和工具箱/工具控件)
  • MainWindowViewModel具有ActiveDocViewModel属性,该属性指向当前活动文档选项卡的DocSimpleViewModel或DocComplexViewModel实例(或者在没有打开文档选项卡时为“null”)。
  • MainWindow工具箱中的各种控件绑定到ActiveDocViewModel的各种属性(即{Binding Path = ActiveDocViewModel.SomeProperty})。

问题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”属性来解决这些问题很容易,但这显然是错误的(当我刚刚结束时,使用继承将“复杂”功能添加到“简单”基类型中会是什么意思无论如何为基类中的所有内容添加存根?)。因此,这些绑定错误的存在使我质疑这种方法是否有缺陷 - 以及我如何处理复杂与简单的情况,同时避免所有绑定错误。

非常感谢任何见解:)

1 个答案:

答案 0 :(得分:1)

起初,我认为总体结构看起来非常好,但我不是专家,也不想给这样的评价。

然后为您解决绑定错误: 您可以使用TemplateSelector,它为模板提供了简单的工具箱"对于DocSimple类型和不同的模板,其中包含简单的工具箱以及DocComplex的其他部分。