0

刚开始学习MVVM。我有一个选项卡控件,我在其中添加相同视图/页面的多个实例

    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 是相同的,所以所有选项卡都会填充相同的视图,并且更改会反映在每个选项卡上。不应该是这样。我应该为每个使用单独的视图模型吗?任何例子都会很有帮助。

4

3 回答 3

3

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

您应该填充视图模型对象的集合并将您在 XAML 中定义的对象绑定ItemsSourceTabControl它。您应该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,并且选项卡项的内容与资源字典中的任何模板匹配视图模型的类型。

于 2011-08-01T15:26:46.340 回答
2

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

TabViewModel 将包含诸如Headeror之类的属性Uri,这些属性将在适当的位置绑定到 UI。每个 TabViewModel 都可以使用相同的 View 进行绘制,但每个选项卡对象内部的数据会有所不同。

我的 ParentViewModel 还将包含一个TabIndex定义选择哪个选项卡的属性

于 2011-08-01T16:35:59.693 回答
0

这不是微不足道的,IMO,Rachel 和 Robert 都是对的。

将此任务视为管理“工作空间”之一,每个都由一个选项卡控件表示。我喜欢将我的视图模型构造成三个相关的层

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

我发现Josh Smith 在 MSDN 上的 MVVM 文章对了解这种设计很有用。

HTH,
绿柱石

于 2011-08-01T17:09:43.537 回答