6

MainWindowは次のものがあります。

 <HeaderedContentControl 
          Content="{Binding Path=Workspaces}"
          ContentTemplate="{StaticResource WorkspacesTemplate}"
          Header="Workspaces"
          Style="{StaticResource MainHCCStyle}"
          />

リソースで:

  <DataTemplate x:Key="WorkspacesTemplate">
    <TabControl 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource ClosableTabItemTemplate}"
      Margin="4"
      />
  </DataTemplate>

そして、記事では次のように述べています。

型指定された DataTemplate には x:Key 値が割り当てられていませんが、DataType プロパティが Type クラスのインスタンスに設定されています。WPF が ViewModel オブジェクトの 1 つをレンダリングしようとすると、リソース システムのスコープ内に型指定された DataTemplate があり、その DataType が ViewModel オブジェクトの型と同じ (またはその基本クラス) であるかどうかがチェックされます。見つかった場合は、そのテンプレートを使用して、タブ項目の Content プロパティによって参照される ViewModel オブジェクトをレンダリングします。

私の質問は:

テンプレートは、型がワークスペース (WorkspaceViewModel) のコレクションであることをどのように認識しますか?

4

2 に答える 2

4

あなたが投稿したコードでは、そうする必要はありません。サンプルでは、​​コンテンツ テンプレートに厳密な値を指定しました。明示的に を使用{StaticResource WorkspacesTemplate}したため、 のキーを持つリソース"WorkspacesTemplateが検索されます。

テンプレートを明示的に設定したため、目的の型が何であるかは問題ではありません:Content設定したテンプレートを使用してオブジェクトを表示しようとします。合わない!

あなたが言及した代替方法では、「型指定されたDataTemplate」を使用して、データテンプレートを<DataTemplate DataType="{x:Type l:WorkSpace}" />. ないことに注意してください(また、ローカル コードにマップされx:Keyた名前空間があると想定していることにも注意してください)。lここで何が起こるかというと、WPF はリソースのキーを自動的に に設定しますDataType(重要な注意: リソース キーは文字列である必要はありません!)。

次に、 を宣言するときにHeaderedContentControl、 の設定を省略できますContentTemplate。実行時にコントロールがレンダリングされると、WPF はContentオブジェクトの型をチェックし、それが であることを確認します。次に、型指定されたテンプレートと一致するWorkSpaceリソースを検索します。x:Key="{x:Type l:WorkSpace}"

DataTemplate型付きは、アプリケーション全体のコンテンツ表示コントロールによって自動的に使用されるため、これはアプリケーション全体でデータの一貫した表現を作成する便利な方法です。

于 2013-06-07T08:13:29.707 に答える
4

WPF は具象型をあまり気にしません。何かの IEnumerable である必要があるだけです。WPF は型記述子を使用して、UI のバインディングを認識します。

于 2013-06-07T08:09:42.683 に答える