かいつまんで、WindowsのユニバーサルアプリDataTemplate.DataType
をサポートしていないので、Windowsのユニバーサルアプリ、x:Key
せずにリソースディクショナリで宣言することはできませんがデータ型のデフォルトのテンプレートをサポートしていません。 x:DataType
添付プロパティWPFで何をDataType
しません。
Windowsユニバーサルアプリケーションでは、ItemsControl.ItemTemplate
などの値としてDataTemplate
のインラインを定義するか、x:Key
というリソースディクショナリで定義できます。テンプレートを選択する場合は、DataTemplateSelector
と記述する必要があります。
あなたの質問では、テンプレートを定義していますが、誰もそれらを使用していません。
これはまあまあです。これは、WPFに適用される私のオリジナルの答えだった
WPFは異なっています。 Windows Universal Appsには該当しませんが、これはこの質問の実際の範囲です。タグの中にはwin-universal-app
と書かれていますが、タグを読み取っていませんでした。それが正しい限りで、誰かをこのページに導く質問への答えになる可能性があるので、私はメタを質問しながらこれをここに置いておきます。
A DataTemplate
without an x:Key
property is applied to any object of the appropriate type。親クラスとサブクラスに別々のデータテンプレートがある場合、それは可能な最も特殊なテンプレートを使用します。 MSDN notes that it's similar to Style.TargetType
:TargetType="{x:Type Button}"
の既定のスタイルがButtonBase
の既定のスタイルを自動的にオーバーライドしなかった場合を想像してください。 カオスが続くだろう!私はこれを明示的に述べている文書を見つけることさえできません。そして、Brian Kernighanが言ったように、 "あなたのコンパイラは言語の最終的な権威です":それは私が書いた簡単なテストで私のために動作する方法です。
DataTemplate
の定義の順序を逆にすると、同じように動作します。また、ItemSubClass
DataTemplate
の定義をWindow.Resources
に移動すると、同じように動作します。
XAML:
<ItemsControl
ItemsSource="{Binding Items}"
BorderBrush="Black"
BorderThickness="1"
Margin="4"
>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:ItemSubClass}">
<Grid Background="Beige">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Text="{Binding Name, StringFormat=Name: {0}}"
/>
<TextBlock
Grid.Column="1"
Text="{Binding Category, StringFormat=Category: {0}}"
/>
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Item}">
<TextBlock Text="{Binding Name, StringFormat=Name: {0}}" />
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
C#:
public class Item : INotifyPropertyChanged
{
private string _name = "";
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] String propName = null)
{
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(propName));
}
}
public class ItemSubClass : Item
{
#region Category Property
private String _category = default(String);
public String Category
{
get { return _category; }
set
{
if (value != _category)
{
_category = value;
OnPropertyChanged();
}
}
}
#endregion Category Property
}
public class ViewModel
{
public ViewModel()
{
Items.Add(new Item { Name="Alan"});
Items.Add(new ItemSubClass { Name = "Bob", Category = "Whatever" });
Items.Add(new Item { Name = "Charlie" });
}
public ObservableCollection<Item> Items { get; private set; }
= new ObservableCollection<Item>();
}
スクリーンショット:
あなた、あなたはDataTemplateSelectorを実装します。このリンクを参照してくださいhttp://stackoverflow.com/questions/25747924/wp-8-1-datatemplateselector-isnt-working – Archana
私はそれが問題ではないことがわかりました。それは定義の順序に関係なくできる最も特殊なテンプレートを使用します。 –
@EdPlunkettあなたがそのソースを見つけることができれば、それを回答として掲示して受け入れます。 – vrwim