MVVM-WPF桌面

MVVM-WPF桌面,wpf,views,wvvm,Wpf,Views,Wvvm,刚开始学习MVVM。我有一个tabcontrol,可以在其中添加相同视图/页面的多个实例 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)

刚开始学习MVVM。我有一个tabcontrol,可以在其中添加相同视图/页面的多个实例

    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是相同的,因此所有选项卡都使用相同的视图填充,并且更改反映在每个选项卡上。但事实并非如此。我应该为每一个使用单独的viewmodel吗?任何示例都会非常有用。

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

您应该填充视图模型对象的集合,并将您在XAML中定义的
TabControl
ItemsSource
绑定到它。您应该为这些对象的数据类型定义一个
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
属性填充选项卡,并且使用资源字典中与视图模型类型匹配的任何模板填充选项卡项的内容。

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

您应该填充视图模型对象的集合,并将您在XAML中定义的
TabControl
ItemsSource
绑定到它。您应该为这些对象的数据类型定义一个
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
属性填充选项卡,并且选项卡项的内容与资源字典中与视图模型类型匹配的任何模板都匹配。

我将在父视图模型中有一个
observeCollection选项卡
,并将TabControl的ItemSource绑定到该选项卡项。每个选项卡都有自己的TabViewModel实例,因此添加一个新选项卡意味着向ParentViewModel中的
Tabs
集合添加一个新的
TabViewModel

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


My ParentViewModel还将包含一个定义所选选项卡的
选项卡索引
属性

我将在我的父视图模型中有一个
ObservableCollection选项卡
,并将选项卡控件的ItemSource绑定到该选项卡。每个选项卡都有自己的TabViewModel实例,因此添加一个新选项卡意味着向ParentViewModel中的
Tabs
集合添加一个新的
TabViewModel

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


My ParentViewModel还将包含一个
TabIndex
属性,该属性定义选择哪个选项卡

这不是小事,依我看,Rachel和Robert都是对的

将此任务视为管理“工作空间”的任务之一,每个工作空间由一个选项卡控件表示

  • DetailViewModel—给定工作区的模型(由选项卡控件表示)
  • MasterViewModel-详细视图模型集合(ObservableCollection{DetailViewModel})的模型。您可以使用它绑定到演示文稿中的列表,该列表显示可以在选项卡控件中选择哪些项进行编辑/显示。如果您允许的话,也可以在此处处理列表筛选
  • ShellViewModel—实际具有工作空间集合(即,ObservableCollection{Workspace})以及管理这些集合的命令(即,EditWorkspaceCommand、AddWorkspaceCommand、DeleteWorkspaceCommand)的模型。工作空间是具有CloseCommand的DetailViewModel
  • 我发现这个设计很有用

    HTH,

    贝里尔

    这不是小事,依我看,雷切尔和罗伯特都是对的

    将此任务视为管理“工作空间”的任务之一,每个工作空间由一个选项卡控件表示

  • DetailViewModel—给定工作区的模型(由选项卡控件表示)
  • MasterViewModel-详细视图模型集合(ObservableCollection{DetailViewModel})的模型。您可以使用它绑定到演示文稿中的列表,该列表显示可以在选项卡控件中选择哪些项进行编辑/显示。如果您允许的话,也可以在此处处理列表筛选
  • ShellViewModel—实际具有工作空间集合(即,ObservableCollection{Workspace})以及管理这些集合的命令(即,EditWorkspaceCommand、AddWorkspaceCommand、DeleteWorkspaceCommand)的模型。工作空间是具有CloseCommand的DetailViewModel
  • 我发现这个设计很有用

    HTH,

    Berryl

    虽然这是一个第三方组件,但我认为是UXTabItem。Source属性主要用于静态XAML内容,如客户信息、联系我们信息等?您是否试图实现显式实例