Line
( System.Windows.Shapes.Line
) オブジェクトに使用される WPF DataTemplate を設定しようとしています。
デフォルトの .NET 4 WPF アプリケーションから、Window xaml を次のように設定します。
<Window x:Class="WpfTestDataTemplates.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type system:String}" >
<TextBlock>It's a string</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type Line}" >
<TextBlock>It's a line</TextBlock>
</DataTemplate>
</Window.Resources>
<ListView ItemsSource="{Binding MyItems}" />
</Window>
コードビハインドは次のとおりです。
using System.Collections.Generic;
using System.Windows;
using System.Windows.Shapes;
namespace WpfTestDataTemplates
{
public partial class MainWindow : Window
{
public List<object> MyItems {get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
MyItems = new List<object>();
MyItems.Add("The first string");
MyItems.Add(new Line { X1 = 0, Y1 = 0, X2 = 5, Y2 = 5 });
MyItems.Add("The second string");
MyItems.Add(new Rectangle { Height = 5, Width = 15 });
MyItems.Add(42);
}
}
}
結果のウィンドウは次のようになります。
2 番目のエントリが次のように表示されることを期待してLine
います。明示的な DataTemplate のない型の場合、デフォルトのレンダリングがオブジェクトの .ToString() メンバーになると予想していますが、それも起こっていません。したがって、4 番目のエントリは System.Windows.Shapes.Rectangle になると思います。
型が認識されないのはなぜ{x:Type Line}
ですか? また、Shape オブジェクトに適用されている DataTemplate は何ですか?