プログラマーな日々

プログラマーをやっています。好きなツール:WorkFlowy、好きな言語:C#、好きなサービス:Backlog、好きなAWS:AWS Lambda。

データテンプレートを使用する

データテンプレートはデータ(このエントリではPerson)を受け取り、表示ツリーを構築します。

アプリ実行

起動


入力


ソースコード

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:l="clr-namespace:WpfApplication6"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <l:TextToPersonConverter x:Key="personConverter" />
    </Window.Resources>
    <StackPanel>
        <TextBox x:Name="textBox1" />
        <ContentControl Margin="5">
            <ContentControl.Content>
                <Binding
                    ElementName="textBox1"
                    Path="Text"
                    Converter="{StaticResource personConverter}">
                </Binding>
            </ContentControl.Content>
            <!-- データテンプレートをContentControlに関連付ける -->
            <ContentControl.ContentTemplate>
                <DataTemplate DataType="{x:Type l:Person}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="名前:" />
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ContentControl.ContentTemplate>
        </ContentControl>
    </StackPanel>
</Window>
Person.cs
namespace WpfApplication6 {
    class Person {
        public string Name { get; set; }
    }
}
TextToPersonConverter.cs
using System;
using System.Globalization;
using System.Windows.Data;

namespace WpfApplication6 {
    class TextToPersonConverter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
            Person p = new Person() { Name = (string) value };
            return p;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
            throw new NotImplementedException();
        }
    }
}

参考

IValueConverter インターフェイス (System.Windows.Data)
カスタム ロジックをバインディングに適用する方法を提供します。