这是关于如何构造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简单的情况,同时避免所有绑定错误。
任何见解将不胜感激:)
完美!工作就像一个魅力,感谢指针:) – Metal450