本稿では、WPFで異なるデータを表示するために、異なるデータ型のDataTemplateによる容器内の異なるアイテムの数を選択するためのメインセレクタで使用されるテンプレートデータをDataTemplateSelectorの使用を記録します。色のブロックを表示するための文字列とはDataTemplateSelectorリストボックスを使用して説明します。
コアのDataTemplateSelector使用はDataTemplateSelectorクラスを継承し、UI上のDataTemplateの異なる種類を達成するために、そのDataTemplateSelectorメソッドをオーバーライドすると、リストボックスItemTemlateSelectorに割り当てられている異なるのDataTemplate。
次のようにリストボックス、テキスト、および色であり、テキストの色のブロックは、データの2つの異なる種類があり、異なるクラスとテンプレートのさまざまなスタイルとタイプを設定することができ、実際のプロジェクトでは、効果は次のとおりです。
以下はコードです:
パブリック クラスDataModel1 { パブリック 文字列名前{ 取得します。セット; } 公共 DataModel1(文字列名) { 名前 = 名前。 } } パブリック クラスDataModel2 { 公共ブラシカラー{ 得ます。セット; } 公共DataModel2(ブラシ色) { カラー = 色。 } } パブリック クラスDataModel { 公共の物体Ob { 取得します。セット; } パブリック 文字列型名{ GET。セット; } } パブリック クラスListBoxDataTemplateSelector:DataTemplateSelector { 公共のDataTemplate Template1を{ 得ます。セット; } 公共のDataTemplate Template2 { 得ます。セット; } 公共 オーバーライドのDataTemplate SelectTemplate(対象項目のDependencyObject容器) { 入力T = item.GetType()。 文字列の型名= nullを。 PropertyInfo []プロパティ = t.GetProperties()。 foreachの(PropertyInfoのPI における特性) { 場合(pi.Name == " 型名" ) { 型名 = pi.GetValue(項目、NULL ).ToString(); 休憩; } } スイッチ(型名) { 場合 "TXT " : リターンTemplate1を、 場合 " 色」: リターンTemplate2; デフォルト: 戻り NULL ; } } }
XAML:
ウィンドウのx:クラス= "ListBoxExample.MainWindow" のxmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" のxmlns:X = "http://schemas.microsoft.com/winfx/2006/ XAML " のxmlns:D = "http://schemas.microsoft.com/expression/blend/2008" のxmlns:MC = "http://schemas.openxmlformats.org/markup-compatibility/2006" のxmlns:ローカル=" CLR -namespace:ListBoxExample」 MC:無視可能= "D" NAME = "MainWindow1" タイトル= "メインウィンドウ"高さ= "350"幅= "525"> < Window.Resources > < たControlTemplate X:キー= "Template1を" > <TextBlock テキスト= " {Ob.Nameバインディング} "/> </ のControlTemplate > < たControlTemplate X:キー= "Template2" > < ボーダー 高さ= "30" 幅= "90" 背景= " {バインディングOb.Color} " > </ ボーダー> </ のControlTemplate > < ローカル。 ListBoxDataTemplateSelectorは×:キー= "ListBoxDataTemplateSelector" > < ローカル:ListBoxDataTemplateSelector.Template1 > < DataTemplateを> <ContentControlにテンプレート=」{StaticResource Template1を} " > </ ContentControlに> </ DataTemplateを> </ ローカル:ListBoxDataTemplateSelector.Template1 > < ローカル:ListBoxDataTemplateSelector.Template2 > < DataTemplateを> < ContentControlにテンプレート=" {StaticResource Template2} " > </ ContentControlに> </ DataTemplateを> </ ローカル:ListBoxDataTemplateSelector.Template2 > </ ローカル:ListBoxDataTemplateSelector > </ ウィンドウ。リソース> <グリッド名= "grid0" 幅= "100" 高さ= "200" > < リストボックス名= "リスト0" ItemTemplateSelector = " {StaticResource ListBoxDataTemplateSelector} " のItemsSource =" {バインディングDATAS} " > </ リストボックス> </ グリッド> < / ウィンドウ>
データの初期化とバインディング:
/// <要約> /// MainWindow.xaml的交互逻辑 /// </要約> パブリック 部分 クラスのメインウィンドウ:ウィンドウ { パブリックメインウィンドウ() { のInitializeComponent(); VaRの VM = 新しいVmを(); この .DataContext = VM; } } パブリック クラスVmの { プライベートのObservableCollection <たDataModel> _Datas = 新規のObservableCollection <たDataModel> (); 公共のObservableCollection <のDataModel> DATAS { 取得 { 戻り_Datasを。} 集合 {_Datas = 値。} } パブリックVmを() { たDataModel A1 = 新規のDataModel {オビ= 新しい DataModel1(" これはNAME1ある")、型名= " TXT " }。 たDataModel A2 = 新規のDataModel {オビ= 新しい DataModel2(Brushes.Red)、型名= " 色" }。 DataModel A3 = 新しいですたDataModel {オビ= 新しい DataModel2(Brushes.Green)、型名= " 色" }。 たDataModel A4 = 新規のDataModel {オビ= 新しい DataModel1(" これはNAME2である")、型名= " TXT " }。 たDataModel A5 = 新規のDataModel {オビ= 新しい DataModel2(Brushes.GreenYellow)、型名= " 色" }。 _Datas.Add(A1)。 _Datas.Add(A2)。 _Datas.Add(A3)。 _Datas.Add(A4)。 _Datas.Add(A5)。 } }
これらは、使用DataTemplateSelectorあり、次のセクションでは、右クリックして、これに基づいて対話的に使用を選択し、左クリック、左クリックが増加します。