かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

****Selector改良

改良といっても、本家のつもりんがちゃんとしたやつのコードを載せてくれた&そっちのほうが強力なので、そっちを使うといいとおもいます・・・!

私のやつは、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以外も置けてしまうのがメリットになるかデメリットになるか…。