Windows 10 UWP 应用中的 ItemsControl 和 ItemTemplateSelector
本文关键字:ItemsControl ItemTemplateSelector UWP 应用 Windows | 更新日期: 2023-09-27 18:31:19
我很久以前做了一些WPF编程,但我刚刚回到UWP的xaml,但我认为这应该有效并且无法弄清楚原因。基本上,我想使用ItemsControl(因为我只想列出一些数据,我不想要选择)而不是ListView控件。 以下是我的资源:
<Page.Resources>
<DataTemplate x:Key="SentMessageDataTemplate">
<TextBlock Text="Sent" />
</DataTemplate>
<DataTemplate x:Key="ReceivedMessageDataTemplate">
<TextBlock Text="Recieved" />
</DataTemplate>
<services:MessageDataTemplateSelector x:Key="MessageDataTemplateSelector" ReceivedTemplate="{StaticResource ReceivedMessageDataTemplate}" SentTemplate="{StaticResource SentMessageDataTemplate}"></services:MessageDataTemplateSelector>
</Page.Resources>
这是我的项目控件:
<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" />
这是我的数据模板选择器:
public class MessageDataTemplateSelector : DataTemplateSelector
{
public DataTemplate SentTemplate
{
get;
set;
}
public DataTemplate ReceivedTemplate
{
get;
set;
}
protected override DataTemplate SelectTemplateCore(object item)
{
var message = item as MessageViewModel;
if (message == null)
{
return this.SentTemplate;
}
return message.Sent ? this.SentTemplate : this.ReceivedTemplate;
}
}
它不显示我的任何一个模板,它只显示我的 ViewModel 类型名称(所以基本上是 ToString)。
但是,如果我将其从项目控件切换到列表视图,它可以正常工作。
有什么建议吗?
请改用此覆盖:
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
这是被调用的那个,而不是没有第二个参数的那个。
有趣 -- ListView 和 GridView 都调用模板选择器;普通 ItemsControl 或 ListBox 则不调用。
覆盖模板选择器中的其他 SelectTemplateCore 方法会有所帮助,例如:
protected override DataTemplate SelectTemplateCore(object item)
{
var message = item as MessageViewModel;
if (message == null)
{
return SentTemplate;
}
return message.Sent ? SentTemplate : ReceivedTemplate;
}
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
return SelectTemplateCore(item);
}
在所有情况下都会调用后一种方法;第一个方法不会针对ItemsControl
项调用。本页提供了各种说明:
如果
ItemsControl.ItemsPanel
是ItemsStackPanel
或ItemsWrapGrid
,请为SelectTemplateCore(Object)
方法提供覆盖。如果ItemsPanel
是不同的面板(如VirtualizingStackPanel
或WrapGrid
),请为SelectTemplateCore(Object, DependencyObject)
方法提供覆盖。
以下是文档的内容:
言论
如果 ItemsControl.ItemsPanel 是 ItemsStackPanel 或 ItemsWrapGrid,请为 SelectTemplateCore(Object) 方法提供重写。如果 ItemsPanel 是不同的面板(如 VirtualizingStackPanel 或 WrapGrid),请为 SelectTemplateCore(Object, DependencyObject) 方法提供覆盖。
也许你应该使用<TextBlock Text="{Binding Sent}" />
您不会绑定模板中的任何内容。