改良といっても、本家のつもりんがちゃんとしたやつのコードを載せてくれた&そっちのほうが強力なので、そっちを使うといいとおもいます・・・!
私のやつは、XAMLの階層が深くなってださかったので、ResourceDictionaryを使うようにして普段DataTemplateを設定してるのと同じ要領で作れてx:Keyを型名にするようにしてみました。
[ContentProperty(Name = "Templates")] publicclass DataTypeTemplateSelector : DataTemplateSelector { private ResourceDictionary templates = new ResourceDictionary(); public ResourceDictionary Templates { get { return templates; } set { templates = value; } } protectedoverride DataTemplate SelectTemplateCore(object item) { if (item == null) { returnnull; } 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以外も置けてしまうのがメリットになるかデメリットになるか…。