【发布时间】:2011-09-27 19:36:36
【问题描述】:
我曾问过一个关于将多个视图模型映射到单个视图的问题 (here)。我得到了一些很好的答案,但我仍然无法将在那里学到的知识应用到我的特定案例中。
简要回顾一下:我想创建一个基础 ItemViewModelBase 类,该类公开我的视图将绑定到的属性。然后我将创建两个特定的视图模型,PeopleViewModel 和 CarsViewModel。这两个都继承自 ItemViewModelBase 并实现了相应的属性。现在,我希望能够创建一个视图,该视图将根据绑定到的视图模型显示适当的信息。由于 PeopleViewModel 和 CarsViewModel 都公开了相同的属性,并且我希望这两个视图的视图看起来相同,因此我只需要一个视图。
我之前的问题中的一个答案建议使用 DataTemplate:
<DataTemplate DataType="{x:Type ItemViewModelBase}">
//some user control
</DataTemplate>
我不熟悉将 DataTemplates 与 MVVM(以及一般的 MVVM)一起使用,所以我有几个问题:
现在 ItemViewModelBase 是一个抽象类,我定义了适当的属性(ItemName、Items 等)。我的 Items 属性是 ObservableCollection:
public virtual ObservableCollection<???> Items { get; set; }
我会将什么作为集合类型?从这个基类派生的类将有不同的列表(Person、Car)。基础视图模型是放置属性的正确位置吗?我确实希望所有派生类都实现它,所以看起来如此。而且让 Person 和 Car 扩展一些基础对象是没有意义的。
假设我不需要对我的视图进行任何自定义。在这种情况下,我只需要一个视图。目前尚不清楚我将如何设置它。我应该为 ItemViewModelBase 创建一个 DataTemplate 和一个视图(用户控件)来表示它吗?现在我使用 Unity 注册我的视图模型,当创建视图时,视图模型被注入到视图中。当我尝试创建视图时,如何区分不同的视图模型?
基本上,我不知道在使用 DataTemplates 时如何显示适当的视图。现在在我的应用程序中,我有一个窗口,其中包含这样定义的选项卡控件:
<Grid>
<TabControl TabStripPlacement="Left" ItemsSource="{Binding TabItems}"/>
</Grid>
TabControl 的样式包含以下设置器:
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Content" Value="{Binding Content}"/>
TabItems 的定义如下:
public ObservableCollection<ConfigTabItem> TabItems { get; set; }
TabItems.Add(new ConfigTabItem() { Header = "People", ResolveView = (Func<object>)(() => (PeopleView)Container.Resolve(typeof(PeopleView), "peopleView")) });
TabItems.Add(new ConfigTabItem() { Header = "Cars", ResolveView = (Func<object>)(() => (CarsView)ConfigurationModule.Container.Resolve(typeof(CarsView), "carsView")) });
因此,就目前而言,我有单独的视图模型和 People 和 Cars 视图,每当单击选项卡时,都会解析相应的视图。
我想更改此设置以使用上述基本视图模型类和带有 DataTemplates 的单个视图。
任何示例代码/示例将不胜感激,它显示了一个基本视图模型类,一些扩展该基本视图模型的其他视图模型类,然后能够基于视图模型显示适当的视图(其中只有一个通用视图)。
【问题讨论】:
-
你使用的是什么 mvvm 框架?
标签: c# wpf mvvm datatemplate