Cle*_*y25 10 c# xaml win-universal-app uwp
我很久以前做过一些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>
Run Code Online (Sandbox Code Playgroud)
这是我的ItemsControl:
<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" />
Run Code Online (Sandbox Code Playgroud)
这是我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
它不是显示我的任何模板,而是显示我的ViewModel类型名称(所以基本上是ToString).
但是,如果我将它从ItemsControl切换到ListView,它工作正常.
有什么建议?
Kor*_*ill 12
改为使用此覆盖:
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
Run Code Online (Sandbox Code Playgroud)
这是被调用的那个,而不是没有第二个参数的那个.
有趣 - ListView和GridView都调用模板选择器; plain 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);
}
Run Code Online (Sandbox Code Playgroud)
在所有情况下都调用后一种方法; 第一个不是要求ItemsControl物品.此页面提供了各种解释:
如果您
ItemsControl.ItemsPanel是ItemsStackPanel或ItemsWrapGrid,则为该SelectTemplateCore(Object)方法提供覆盖.如果ItemsPanel是不同的面板,例如VirtualizingStackPanel或WrapGrid,则为该SelectTemplateCore(Object, DependencyObject)方法提供覆盖.
| 归档时间: |
|
| 查看次数: |
6421 次 |
| 最近记录: |