C# WPF/MVVM选项卡式设计与维护;避免绑定错误

C# WPF/MVVM选项卡式设计与维护;避免绑定错误,c#,wpf,mvvm,binding,mdi,C#,Wpf,Mvvm,Binding,Mdi,这是一个关于如何构造MVVM/WPF应用程序的“最佳实践设计”问题 想象一下像Photoshop这样的东西,你有一个编辑器可以打开多个(选项卡式)文档&一个工具箱。每个工具仅设置当前活动文档的属性(如打开过滤器和设置过滤器参数)。我正在使用Actipro的Docking&MDI框架作为选项卡式界面 支持两种类型的文档:称它们为DocSimple&DocComplex,其中DocComplex提供DocSimple的所有可控属性,以及一些附加属性 我现在所做的: 整个应用程序的MainWindo

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

想象一下像Photoshop这样的东西,你有一个编辑器可以打开多个(选项卡式)文档&一个工具箱。每个工具仅设置当前活动文档的属性(如打开过滤器和设置过滤器参数)。我正在使用Actipro的Docking&MDI框架作为选项卡式界面

支持两种类型的文档:称它们为DocSimple&DocComplex,其中DocComplex提供DocSimple的所有可控属性,以及一些附加属性

我现在所做的:

  • 整个应用程序的MainWindow.xaml和MainWindowViewModel(包含停靠容器和工具箱/工具控件)
  • MainWindowViewModel具有ActiveDocViewModel属性,该属性指向当前活动文档选项卡的DocSimpleViewModel或DocComplexViewModel实例(如果没有打开文档选项卡,则为“null”)
  • 主窗口工具箱中的各种控件都绑定到ActiveDocViewModel的各种属性(即{Binding Path=ActiveDocViewModel.SomeProperty})
问题1:一般来说,这似乎是一种合理的方法吗?这是我的第一个MVVM应用程序(来自WinForms)&尽管一切都正常工作,但我对绑定到ActiveDocViewModel.Prop是否可取有些怀疑……但这似乎也是最合乎逻辑的方法,因为有一个“一个”主窗口需要绑定到“许多可能的”文档选项卡之一

问题2:如上所述,DocComplex提供的属性/选项比DocSimple更多。我通过从DocSimpleViewModel继承DocComplexViewModel来处理此问题,并在MainWindowViewModel中创建一个属性,如:

public bool IsComplexToolsVisible
{
    get
    {
        return(ActiveDocViewModel != null && ActiveDocViewModel is DocComplexViewModel);
    }
}
这与工具箱中该部分的“可见性”有关。同样,它可以按预期的方式工作-但每当我们打开DocSimple时,它也会为复杂工具部分中的每个属性产生“BindingExpression路径错误:'xxx'property not found”错误。通过向DocSimple添加“stub”属性来修复这些问题很容易,但这显然是错误的(当我最终为基类中的所有内容添加stub时,使用继承向“simple”基类添加“复杂”功能有什么意义?)。因此,这些绑定错误的存在让我质疑这种方法是否有缺陷,以及如何在避免所有绑定错误的同时处理复杂与简单的场景


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

首先,在我看来,总体结构看起来非常好,但我不是专家,不想给这样的东西打分


然后针对绑定错误的问题: 您可以使用,它为DocSimple类型提供了一个带有“简单工具箱”的模板,以及一个不同的模板,其中包含简单工具箱和DocComplex的其他部分