Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

DataTemplateSelectorでテンプレートを選択する

アプリ実行


ソースコード

App.xaml
<Application x:Class="WpfApplication6.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>
MainWindow.xaml
<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sx="clr-namespace:System.Xml;assembly=System.Xml"
        xmlns:l="clr-namespace:WpfApplication6"
        DataContext="{DynamicResource dataSource}"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <XmlDataProvider x:Key="dataSource">
            <x:XData>
                <Company xmlns="">
                    <SoumuBu Manager="山田太郎" />
                    <KeiriBu Manager="佐藤次郎" />
                    <JinjiBu Manager="渡辺三郎" />
                </Company>
            </x:XData>
        </XmlDataProvider>
        <DataTemplate x:Key="SoumuBu" DataType="{x:Type sx:XmlElement}">
            <StackPanel Orientation="Horizontal">
                <Ellipse Margin="2" Width="14" Height="14" Fill="Red" />
                <TextBlock Text="{Binding XPath=@Manager}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="KeiriBu" DataType="{x:Type sx:XmlElement}">
            <StackPanel Orientation="Horizontal">
                <Ellipse Margin="2" Width="14" Height="14" Fill="Silver" />
                <TextBlock Text="{Binding XPath=@Manager}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="JinjiBu" DataType="{x:Type sx:XmlElement}">
            <StackPanel Orientation="Horizontal">
                <Ellipse Margin="2" Width="14" Height="14" Fill="Blue" />
                <TextBlock Text="{Binding XPath=@Manager}" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="部長の名前" />
        <ListBox
            ItemsSource="{Binding XPath=/Company/*}">
            <ListBox.ItemTemplateSelector>
                <l:SectionTemplateSelector />
            </ListBox.ItemTemplateSelector>
        </ListBox>
    </StackPanel>    
</Window>
SectionTemplateSelector.cs
using System.Windows;
using System.Windows.Controls;
using System.Xml;

namespace WpfApplication6 {
    class SectionTemplateSelector : DataTemplateSelector {
        public override DataTemplate SelectTemplate(object item, DependencyObject container) {
            XmlElement data = item as XmlElement;
            if (data != null) {
                return ((FrameworkElement)container).FindResource(data.LocalName) as DataTemplate;
            }
            return null;
        }
    }
}

参考

DataTemplateSelector クラス (System.Windows.Controls)
データ オブジェクトおよびデータ バインドされた要素に基づいて DataTemplate を選択する方法を提供します。