2010-08-03 33 views
1

我想在我的框架中编写一个具有MVVM模式的Detail(Info)屏幕。将会有一个基本的详细视图模型和视图,在这个工具栏上有一个工具栏和按钮(保存,删除,新按钮等)。这个框架的用户将不用手动添加工具栏来编写他/她的详细信息(信息)屏幕。他们的细节(信息)屏幕的视图模型将从框架的细节(信息)视图模型继承。所以工具栏会自动添加到他/她的详细信息(信息)屏幕上。在MVVM中实现可视化继承的策略是什么?

有没有人实现这样的情况之前,或者你可以给我在这个问题上的模式或战略?谢谢大家。

回答

1

我没有在我的MVVM可视化继承 - 我设计我的计划,以适应该平台不明确使用不支持的技术。

我建立共同的元件无论是作为该视图使用一个控制或作为从装饰或ContentControl中衍生的,该框架自动插入(在这种情况下,视图变成控制的子层)的类。

即使你找到了一些解决方法,可以让你使用可视化继承它不支持和肯定的方式来陷入困境后,当你打你的解决方法

2

我不使用可视化继承的限制。相反,我有主窗口与按钮工具栏和我插入用户控件的区域。

的ViewModels为每个用户控制界面实现具有对工具栏上的按钮的命令,所以可结合按钮命令中的每个用户控制的实现。

参见MSDN文章中例如:WPF Apps With The Model-View-ViewModel Design Pattern

1

我认为“继承”是不正确的术语,你可以用在这种情况下,虽然我不知道是什么。

“继承”指一种特定的类别和子类之间的关系。您可以构建视图模型基类并从它们继承,但是您无法真正有意义地在视图中执行该操作,因为视图是通过构图构建的,而不是通过实现属性和方法构建的。

这当然有道理的构建视图模型基类,做你的描述,虽然。我现在正在做一个我正在开发的项目。我有一个视图模型类,通过公开CommandLinks集合来支持菜单中的链接。集合中的每个CommandLink对象都会显示链接文本,更详细的说明以及Command。在视图中,我有一个DataTemplate,它在DockPanel内部设置了HyperlinkTextBlock,并且视图模型的DataTemplate包含ItemsControl,它与我的视图模型中的CommandLinks集合绑定。视图模型子类填充CommandLinks集合,Bob是你的叔叔。我的应用程序不需要在基类中填充CommandLinks集合,因为每个视图模型类的命令都不相同,但没有理由不能。尽管如此,我不会称之为“可视化继承”。因为如果我决定以不同的方式布置特定的视图模型类,我不能在我的实现中重写DataTemplate。我必须专门为该课程构建新的DataTemplate。这是继承概念开始崩溃的地方。

如果我将(例如)的DataContext设置为我的视图模型的实例,WPF将查看资源字典以查找由对象类型键入的DataTemplate。如果派生类型没有定义,它将使用基类型的模板。但是如果派生类型确实有有一个定义,WPF将使用该定义。而且你真的没有办法从另一个模板继承一个模板,所以子类的模板不能像神奇般地看起来像基类的模板。

你最终实现它是这样,而不是:

<DataTemplate DataType="{x:Type MyBaseClass}"> 

    <DataTemplate.Resources> 
     <DataTemplate DataType="{x:Type MyBaseClass}"> ... 
     <DataTemplate DataType="{x:Type MyDerivedClass1}"> ... 
     <DataTemplate DataType="{x:Type MyDerivedClass2}"> ... 
    </DataTemplate.Resources> 

    <DockPanel> 
     <ItemsControl DockPanel.Dock="Left" ItemsSource="{Binding CommandLinks}"/> 
     <ContentPresenter DataContext="{Binding}"/> 
    </DockPanel> 

</DataTemplate> 

这不是真正继承。没有办法让别人实现他们自己的派生类而不修改基类的数据模板。

你可以通过给容器模板一个键来解决这个问题。但是,实施该观点的人需要知道这一点。他不能仅仅做到这一点,例如:

<ItemsControl ItemsSource="{Binding MyObjectList}"/> 

而是必须做这样的事情:

<ItemsControl ItemsSource="{Binding MyObjectList}" ItemTemplate="{StaticResource MyBaseClassTemplate}"/> 

看起来像一个巨大的代价,对我来说这并不。但是,我通常是我项目中唯一的开发人员。