我想在我的框架中编写一个具有MVVM模式的Detail(Info)屏幕。将会有一个基本的详细视图模型和视图,在这个工具栏上有一个工具栏和按钮(保存,删除,新按钮等)。这个框架的用户将不用手动添加工具栏来编写他/她的详细信息(信息)屏幕。他们的细节(信息)屏幕的视图模型将从框架的细节(信息)视图模型继承。所以工具栏会自动添加到他/她的详细信息(信息)屏幕上。在MVVM中实现可视化继承的策略是什么?
有没有人实现这样的情况之前,或者你可以给我在这个问题上的模式或战略?谢谢大家。
我想在我的框架中编写一个具有MVVM模式的Detail(Info)屏幕。将会有一个基本的详细视图模型和视图,在这个工具栏上有一个工具栏和按钮(保存,删除,新按钮等)。这个框架的用户将不用手动添加工具栏来编写他/她的详细信息(信息)屏幕。他们的细节(信息)屏幕的视图模型将从框架的细节(信息)视图模型继承。所以工具栏会自动添加到他/她的详细信息(信息)屏幕上。在MVVM中实现可视化继承的策略是什么?
有没有人实现这样的情况之前,或者你可以给我在这个问题上的模式或战略?谢谢大家。
我没有在我的MVVM可视化继承 - 我设计我的计划,以适应该平台不明确使用不支持的技术。
我建立共同的元件无论是作为该视图使用一个控制或作为从装饰或ContentControl中衍生的,该框架自动插入(在这种情况下,视图变成控制的子层)的类。
即使你找到了一些解决方法,可以让你使用可视化继承它不支持和肯定的方式来陷入困境后,当你打你的解决方法
我不使用可视化继承的限制。相反,我有主窗口与按钮工具栏和我插入用户控件的区域。
的ViewModels为每个用户控制界面实现具有对工具栏上的按钮的命令,所以可结合按钮命令中的每个用户控制的实现。
参见MSDN文章中例如:WPF Apps With The Model-View-ViewModel Design Pattern
我认为“继承”是不正确的术语,你可以用在这种情况下,虽然我不知道是什么。
“继承”指一种特定的类别和子类之间的关系。您可以构建视图模型基类并从它们继承,但是您无法真正有意义地在视图中执行该操作,因为视图是通过构图构建的,而不是通过实现属性和方法构建的。
这当然有道理的构建视图模型基类,做你的描述,虽然。我现在正在做一个我正在开发的项目。我有一个视图模型类,通过公开CommandLinks
集合来支持菜单中的链接。集合中的每个CommandLink
对象都会显示链接文本,更详细的说明以及Command
。在视图中,我有一个DataTemplate
,它在DockPanel
内部设置了Hyperlink
和TextBlock
,并且视图模型的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}"/>
看起来像一个巨大的代价,对我来说这并不。但是,我通常是我项目中唯一的开发人员。