2011-08-01 61 views
0

刚开始学习MVVM。我有一个TabControl在那里我加入同样的观点/页的多个实例MVVM - WPF桌面

Dim tb As New UXTabItem 

    tb.Header = "Childrens" 

    tb.Name = "tab" & itrt 
    itrt = itrt + 1 

    tb.Source = New Uri("/Views/childrens.xaml", UriKind.Relative) 
UXTabControl1.Items.Add(tb) 

由于每个相同的观点将处理不同的数据,但由于URI是相同的,所以所有的标签逐渐加入相同的观点和变化反映在每个标签上。这不应该是这种情况。我应该为每个人使用单独的视图模型吗?任何示例都会很有帮助。

+0

虽然这是我想UXTabItem.Source属性主要用于静态XAML内容的客户信息等第三方组件,与我们联系信息等?您是否想要实现“儿童”的明确实例,那么您必须将它们作为UserControls进行托管。另外,source属性并不了解View的底层ViewModel,甚至不知道它背后的代码chidlrens.xaml.cs(因为它不会包含用于创建“childrens”的UI)... –

回答

3

MVVM的主要目标/优点之一是您不要在代码中创建WPF UI对象。

您应该填充视图模型对象的集合并将您在XAML中定义的TabControlItemsSource绑定到它。您应该为这些对象的数据类型定义一个DataTemplate,并将它们的XAML放在那里,而不是在运行时加载它。

TabControl是有点棘手,因为它使用模板:在ItemTemplate用于定义标签的外观,和ContentTemplate被用来定义标签项的内容的外观。这是很常见的,看看这个:

<TabControl ItemsSource="{Binding MyItems}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
     <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
     <ContentPresenter Content="{Binding}"/> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

其填充与视图模型Text属性标签,标签项的内容与资源字典任何模板视图模型的类型相匹配。

2

我会在我的父ViewModel ObservableCollection<TabViewModel> Tabs,并将TabControl的ItemSource绑定到该。每个Tab都有它自己的TabViewModel实例,因此添加一个新Tab将意味着在ParentViewModel中向Tabs集合添加新的TabViewModel

TabViewModel将包含诸如HeaderUri之类的属性,并且这些属性将被绑定到相应位置的UI。每个TabViewModel可以使用相同的视图绘制,但对象内的数据对于每个选项卡都不相同。

我ParentViewModel也将包含TabIndex属性,它定义了标签被选中

0

这是不平凡的,IMO,拉结和罗伯特都是对的。

觉得这个任务是管理“工作空间的一个”,每一个标签控件来表示我喜欢我的视图模型构建成三个相关层

  1. DetailViewModel的 - 该模型对于给定的工作空间(由选项卡控件表示)
  2. MasterViewModel - 详细视图模型集合(ObservableCollection {DetailViewModel})的模型。您可以使用它绑定到我们的演示文稿列表,以显示可以选择哪些项目进行编辑/显示在选项卡控件中,如果允许的话,这也是对列表进行过滤的地方,
  3. ShellViewModel - 实际上具有工作空间集合(即,ObservableCollection {Workspace})以及用于管理它们的命令(即EditWorkspaceCommand,AddWorkspaceCommand,DeleteWorkspaceCommand)的模型。工作区是具有CloseCommand的DetailViewModel。

我发现Josh Smith's MVVM article on MSDN用于Grokking这种设计。

HTH,
Berryl