3

MVVMとサンプル アプリケーションに関する Josh Smith の MSDN 記事についてです。このトピックについてSOに多くの質問があることを知っており、それらすべてを調査しました。それらのほとんどは MVVM に焦点を当てていますが、私の問題は、MVVM よりも XAML に関連していると思います。

サンプル アプリケーションには、ワークスペース領域用の次の XAML が含まれています。

<Border Grid.Column="2" Style="{StaticResource MainBorderStyle}">
    <ContentControl Content="{Binding Path=Workspaces}" ContentTemplate="{StaticResource ResourceKey=WorkspacesTemplate}"/>
</Border>

関連するリソースは次のとおりです -

//Explains how to render the 'Workspace' content area in the main window
<DataTemplate x:Key="WorkspacesTemplate">
    <TabControl Margin="4" ItemsSource="{Binding}"
                IsSynchronizedWithCurrentItem="True"                    
                ItemTemplate="{StaticResource ResourceKey=ClosableTabItemTemplate}"/>
</DataTemplate>

//Explains how to render a tab item with a close button
<DataTemplate x:Key="ClosableTabItemTemplate">
    <DockPanel Width="120">
        <Button Command="{Binding Path=CloseCommand}" Content="X" Cursor="Hand" 
                DockPanel.Dock="Right" Focusable="False" FontFamily="Courier" 
                FontSize="9" FontWeight="Bold" Margin="0,1,0,0" Padding="0" 
                VerticalContentAlignment="Bottom" Width="16" Height="16"/>
        <ContentPresenter Content="{Binding Path=DisplayName}" VerticalAlignment="Center"/>
    </DockPanel>
</DataTemplate>

私がまだ理解していないこと -

  • 構文ItemsSource="{Binding}"は、DataContext のプロパティではなく、ItemsSource を TabControl の DataContext に直接バインドする必要があります。しかし、TabControl の DataContext はどこに設定されているのでしょうか?
  • Content="{Binding Path=Workspaces}"TabControl の ItemsSource とワークスペース (WorkspaceViewModel の ObservableCollection) の間のバインディングをどのように正確に作成していますか?
  • 記事には、 データ バインディングに依存することで、Contenta のプロパティがTabItemViewModelBase から派生したオブジェクトを受け取り、 を表示すると書かれています。どのように ?!?わかりました、 data bindingを通して。しかし、それは私にとって抽象化するには多すぎます。

一般にthe way binding is flowing/working through these two resources behind the scene、TabItems にビューをロードすることができません。私にとっては、何が何にバインドされているかのようなものです。

この伝説的な記事とサンプル アプリケーションは、WPF/MVVM の初心者にとって非常に役立つものです。しかし、それはあまり詳細ではありません。私自身、これでMVVMの使い方を学びました。私のような人はいるし、これからもいると思います。それで、バインディングシーケンスをもう少し詳しく説明してもらえますか?

関連ノート:

この文脈で私がすでに知っていることのヒントをあなたに与え、あなたが答えるのを助けるかもしれません. 私は初心者レベルの WPF アプリケーション開発者です。私のXAMLに関する知識 はあまりよくありません-

  • DataTemplateViewModel タイプが発生したときに View を表示し、ViewModel をその View の DataContext として設定するというtyped- による魔法を認識しています。
  • 私の理解では、Content はContentControl にを表示するかを示し、ContentTemplate はそのコンテンツを表示する方法を示します。
  • 私は基本的なデータ バインディングの概念以上のものを持っており、いくつかの WPF/MVVM プロジェクトに携わってきました。
4

2 に答える 2

3

構文 ItemsSource="{Binding}" は、ItemsSource を DataContext のプロパティではなく、TabControl の DataContext に直接バインドする必要があります。しかし、TabControl の DataContext はどこに設定されているのでしょうか?

データ テンプレートであるため、テンプレート化TabControlするDataContextデータ項目に (WPF によって) セットされます。実際、データ テンプレートのルート レベルのアイテムは、DataContextWPF によって設定されます。この場合、それはTabControl.

データ テンプレートはContentControlのプロパティに割り当てられているため、を としてContentTemplate自動的に受け取りContentControlます。ContentDataContext

Content="{Binding Path=Workspaces}" は、TabControl の ItemsSource とワークスペース (WorkspaceViewModel の ObservableCollection) の間のバインディングをどのように作成していますか?

私の以前の回答はこれに対処していると思いますが、この質問に直接答える形でもう一度述べさせてください. のバインドContentControlにより、DataContextDataTemplateワークスペース コレクションに設定されます。したがって、 は、なしでTabControlを指定することにより、ワークスペース コレクションにバインドできます。BindingPath

この記事には、データ バインディングに依存することで、TabItem の Content プロパティが ViewModelBase から派生したオブジェクトを受け取って表示する、と書かれています。どのように ?!?わかりました、データバインディングを通して。しかし、それは私にとって抽象化するには多すぎます。

TabItem繰り返しになりますが、これは生成されたアイテム (この場合は a) のデータ コンテキストとして正しいオブジェクトを自動的に割り当てる WPF に帰着します。ItemsControl( など) がコレクションにバインドされると、バインドされたコレクション内の各項目に対してTabControlコンテナー (この場合は a) が生成されます。TabItemコンテナーは、データ アイテム (この場合はワークスペース ビュー モデル) をデータ コンテキストとして自動的に受け取ります。

于 2012-09-12T12:55:13.357 に答える
0

「しかし、TabControl の DataContext は正確にどこに設定されているのでしょうか?」Workspaces は DataContext であり、TabControl の Itemssource です。

<ContentControl Content="{Binding Path=Workspaces}" ContentTemplate="{StaticResource ResourceKey=WorkspacesTemplate}"/>

「Content="{Binding Path=Workspaces}" は、TabControl の ItemsSource とワークスペース (WorkspaceViewModel の ObservableCollection) の間のバインディングをどのように作成していますか?」ワークスペースは DataTemplate/TabControl の DataContext であり、ItemsSource は DataContext に設定されます。

 <TabControl Margin="4" ItemsSource="{Binding}"

「記事には、データ バインディングに依存することで、TabItem の Content プロパティが ViewModelBase から派生したオブジェクトを受け取って表示すると書かれています。どのように?!?」記事はわかりませんが、Workspaces は ViewModelBase から派生したオブジェクトのコレクションだと思います。すべての tabitem はコレクションの項目を表し、viewmodelbase から派生したオブジェクトです。

于 2012-09-12T13:20:51.587 に答える