かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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