改良といっても、本家のつもりんがちゃんとしたやつのコードを載せてくれた&そっちのほうが強力なので、そっちを使うといいとおもいます・・・!
私のやつは、XAMLの階層が深くなってださかったので、ResourceDictionaryを使うようにして普段DataTemplateを設定してるのと同じ要領で作れてx:Keyを型名にするようにしてみました。
[ContentProperty(Name = "Templates")] public class DataTypeTemplateSelector : DataTemplateSelector { private ResourceDictionary templates = new ResourceDictionary(); public ResourceDictionary Templates { get { return templates; } set { templates = value; } } protected override DataTemplate SelectTemplateCore(object item) { if (item == null) { return null; } var dict = (IDictionary<object, object>)this.Templates; object result = null; bool ignore = dict.TryGetValue(item.GetType().Name, out result); return result as DataTemplate; } }
使い方はこんな感じ。
<ListView ItemsSource="{Binding}"> <ListView.ItemTemplateSelector> <local:DataTypeTemplateSelector> <DataTemplate x:Key="Person"> <StackPanel> <TextBlock Text="にんげんです" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </DataTemplate> <DataTemplate x:Key="Dog"> <StackPanel Orientation="Horizontal"> <TextBlock Text="いぬです" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </DataTemplate> </local:DataTypeTemplateSelector> </ListView.ItemTemplateSelector> </ListView>
DataTemplate以外も置けてしまうのがメリットになるかデメリットになるか…。