WPF/MVVM 选项卡式设计和避免绑定错误



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

设想诸如Photoshop之类的东西,您的编辑器可以打开多个(选项卡)文档&工具箱。每个工具只需设置当前活跃文档的属性(例如打开过滤器&设置过滤器参数)。我正在使用Actipro的Docking&标签接口的MDI框架。

支持两种类型的文档:将其称为Docsimple&doccomplex,doccomplex提供了Docsimple的所有可控属性,以及一些其他。

我现在所做的:

  • mainwindow.xaml&整体应用程序的MainWindowViewModel(包含对接容器& toolbox/tool Controls)
  • mainWindowViewModel具有一个ActivedOcViewModel属性,该属性指向当前活动文档选项卡的DocsimpleviewModel或DoccomplexviewModel实例(或当没有文档选项卡时" null")。
  • )。
  • MainWindow工具箱中的各种控件义务限于ActivedOcViewModel的各种属性(即{binding Path = pactivedocviewmodel.someproperty})。

问题1 :通常,这似乎是一种合理的方法吗?这是我的第一个MVVM应用程序(来自Winforms),&尽管一切正常,但我对是否建议对ActivedocviewModel.prop ...但这似乎是最合乎逻辑的方法,这是一个疑问,这也是最合乎逻辑的方法,因为有一个"一个"一个" Mainwindow需要绑定到"许多可能的" Doc Tabs。

)之一

问题2 :如前所述,Doccomplex提供的属性/选项比DocSimple提供了更多的属性/选项。我通过从docsimpleviewmodel继承doccomplexviewmodel来处理此操作,&在MainWindowViewModel中创建属性,例如:

public bool IsComplexToolsVisible
{
    get
    {
        return(ActiveDocViewModel != null && ActiveDocViewModel is DocComplexViewModel);
    }
}

这与工具箱该部分的"可见性"绑定。同样,它的工作原理 - 但每当我们打开DocSimple时,它也会产生" binding Expression路径误差:找不到的'xxx'属性"。通过在DocSimple中添加"存根"属性来修复这些问题非常容易,但这显然是错误的(使用继承将"复杂"功能添加到"简单"基本类型时,这是我最终添加"复杂"功能的意义。无论如何,为基类中的所有内容添加了存根吗?)。因此,这些绑定错误的存在使我质疑这种方法是否存在缺陷 - 以及如何处理复杂的情况与简单的方案,同时避免所有绑定错误。

任何见解都将不胜感激:)

一开始,我认为一般结构看起来非常好,但是我不是专家,也不想对类似的东西进行评分。


然后,您的绑定错误问题:您可以使用templatesElector,该模板将为DocSimple类型和其他模板提供带有"简单工具箱"的模板,该模板包含简单的工具箱以及Doccomplex的其他零件。

最新更新