2016-12-29 88 views
1

这是关于如何构造MVVM/WPF应用程序的“最佳实践设计”问题。WPF/MVVM选项卡式设计和避免绑定错误

设想一些像Photoshop,你有一个编辑器,可以打开多个(标签式)文件&工具箱。每个工具只需设置当前活动文档的属性(如打开设置过滤器参数的过滤器&)。我为标签界面使用Actipro的Docking & 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); 
    } 
} 

这必将对工具箱的那一段的“能见度”。再次,它按预期工作 - 但它也会产生“复杂工具”部分中每个属性的“BindingExpression路径错误:'xxx'属性未找到”错误,只要我们打开DocSimple即可。通过向DocSimple添加'stub'属性可以很容易地解决这些问题,但是这显然是错误的(当我最终结束时,使用继承将“复杂”功能添加到“简单”基本类型的意义何在?无论如何,为基础类中的所有东西添加存根?)。所以这些绑定错误的存在使我怀疑这种方法是否存在缺陷 - 以及我如何处理复杂vs简单的情况,同时避免所有绑定错误。

任何见解将不胜感激:)

回答

1

首先,一般的结构看起来在我看来很不错,但我不是专家,没有想为这样的事情。


那么对你问题的绑定错误: 你可以使用一个TemplateSelector,这给出了一个模板,以“简单的工具箱”为DocSimple类型和不同的模板,它包含了简单的工具箱中加上附加DocComplex的部件。

+0

完美!工作就像一个魅力,感谢指针:) – Metal450