Windows 10 UWP 应用中的 ItemsControl 和 ItemTemplateSelector
ItemsControl and ItemTemplateSelector in Windows 10 UWP app
我很久以前做过一些 WPF 编程,但我现在刚回到 xaml 使用 UWP,但我认为这应该可行,但我不明白为什么。基本上我想使用 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:
<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" />
这是我的 DataTemplateSelector:
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)。
但是,如果我将它从 ItemsControl 切换到 ListView,它就可以正常工作。
有什么建议吗?
也许你应该使用 <TextBlock Text="{Binding Sent}" />
您没有在模板中绑定任何内容。
改为使用此覆盖:
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
这是被调用的那个,而不是没有第二个参数的那个。
有趣 -- ListView 和 GridView 都调用模板选择器;普通的 ItemsControl 或 ListBox 不会。
覆盖模板选择器中的 other 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
项。 This page 提供了各种解释:
If your ItemsControl.ItemsPanel
is an ItemsStackPanel
or ItemsWrapGrid
, provide an override for the SelectTemplateCore(Object)
method. If the ItemsPanel
is a different panel, such as VirtualizingStackPanel
or WrapGrid
, provide an override for the SelectTemplateCore(Object, DependencyObject)
method.
文档是这样说的:
备注
如果您的 ItemsControl.ItemsPanel 是 ItemsStackPanel 或 ItemsWrapGrid,请为 SelectTemplateCore(Object) 方法提供覆盖。如果 ItemsPanel 是不同的面板,例如 VirtualizingStackPanel 或 WrapGrid,请为 SelectTemplateCore(Object, DependencyObject) 方法提供覆盖。
我很久以前做过一些 WPF 编程,但我现在刚回到 xaml 使用 UWP,但我认为这应该可行,但我不明白为什么。基本上我想使用 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:
<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" />
这是我的 DataTemplateSelector:
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)。
但是,如果我将它从 ItemsControl 切换到 ListView,它就可以正常工作。
有什么建议吗?
也许你应该使用 <TextBlock Text="{Binding Sent}" />
您没有在模板中绑定任何内容。
改为使用此覆盖:
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
这是被调用的那个,而不是没有第二个参数的那个。
有趣 -- ListView 和 GridView 都调用模板选择器;普通的 ItemsControl 或 ListBox 不会。
覆盖模板选择器中的 other 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
项。 This page 提供了各种解释:
If your
ItemsControl.ItemsPanel
is anItemsStackPanel
orItemsWrapGrid
, provide an override for theSelectTemplateCore(Object)
method. If theItemsPanel
is a different panel, such asVirtualizingStackPanel
orWrapGrid
, provide an override for theSelectTemplateCore(Object, DependencyObject)
method.
文档是这样说的:
备注
如果您的 ItemsControl.ItemsPanel 是 ItemsStackPanel 或 ItemsWrapGrid,请为 SelectTemplateCore(Object) 方法提供覆盖。如果 ItemsPanel 是不同的面板,例如 VirtualizingStackPanel 或 WrapGrid,请为 SelectTemplateCore(Object, DependencyObject) 方法提供覆盖。