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 の主な目標/利点の 1 つは、コードで WPF UI オブジェクトを作成しないことです。

ビュー モデル オブジェクトのコレクションを設定し、XAML で定義した をそれにItemsSourceバインドする必要があります。実行時にロードするのではなく、これらのオブジェクトのデータ型を定義し、そこに XAML を配置するTabControl必要があります。DataTemplate

2 つのテンプレートTabControlを使用するため、少し注意が必要です。はタブの外観を定義するために使用され、 はタブ項目のコンテンツの外観を定義するために使用されます。これを見るのはかなり一般的です:ItemTemplateContentTemplate

<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

親の ViewModel にがObservableCollection<TabViewModel> Tabsあり、TabControl の ItemSource をそれにバインドします。各タブには、TabViewModel の独自のインスタンスがあるため、新しいタブを追加すると、ParentViewModelTabViewModelTabsコレクションに新しいタブが追加されます。

TabViewModel にはHeaderやなどのプロパティが含まれUri、これらは適切な場所で UI にバインドされます。各 TabViewModel は同じビューを使用して描画できますが、オブジェクト内のデータはタブごとに異なります。

私の ParentViewModel には、TabIndexどのタブが選択されているかを定義するプロパティも含まれます

于 2011-08-01T16:35:59.693 に答える
0

これは些細なことではありません.IMOであり、レイチェルとロバートはどちらも正しいです.

このタスクは、それぞれがタブ コントロールで表される「ワーク スペース」の管理の 1 つだと考えてください。ビュー モデルを 3 つの関連するレイヤーに構造化するのが好きです。

  1. DetailViewModel - 特定のワークスペースのモデル (タブ コントロールで表される)
  2. MasterViewModel - 詳細ビュー モデルのコレクションのモデル (ObservableCollection{DetailViewModel})。これを使用して、タブ コントロールで編集/表示するために選択できるアイテムを示すプレゼンテーションのリストにバインドします。これは、許可されている場合、リストのフィルタリングも処理される場所です。
  3. ShellViewModel - ワークスペースのコレクションを実際に持つモデル (つまり、ObservableCollection{Workspace} とそれらを管理するコマンド (つまり、EditWorkspaceCommand、AddWorkspaceCommand、DeleteWorkspaceCommand)。ワークスペースは、CloseCommand を持つ DetailViewModel です。

MSDN の Josh Smith の MVVM 記事は、この設計を理解するのに役立ちました。

HTH、
ベリル

于 2011-08-01T17:09:43.537 に答える