2016-01-21 64 views
8

很久以前,我做了一个WPF编程,但我只是用UWP返回到xaml,但我认为这应该起作用,并且找不到原因。基本上我想使用ItemsControl(因为我只想列出一些数据,我不想选择)而不是ListView控件。这里是我的资源:Windows 10 UWP应用程序中的ItemsControl和ItemTemplateSelector

<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; 
    } 
} 

而不是显示无论是我的模板,它只是显示我的视图模型类型名称(所以基本上ToString)。

但是,如果我从ItemsControl切换到ListView,它工作正常。

有什么建议吗?

+0

最近有一个应用程序出现同样的问题!想知道如果这是可以解决的... – Depechie

回答

9

使用此覆盖代替:

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 

这是一个被调用,而不是一个没有第二个参数。

+0

我试过了,没有运气。ItemsPanelTemplate与默认模板相同。这工作正常,如果我设置一个ItemTemplate,它只是不喜欢ItemTemplateSelectors。 – Cleverguy25

+0

我更新了我的答案。 1参数的覆盖不会被调用(如您所见)。有2个可用。棘手。 –

0

也许你应该使用<TextBlock Text="{Binding Sent}" /> 你不会在你的模板中绑定任何东西。

+0

即使我确实绑定了一些东西,但它不起作用。即使没有绑定任何东西,ListView的作品如果我在DataTemplateSelector中设置了一个断点,它在ItemsControl中运行时永远不会被调用。我认为这只是一个错误。 – Cleverguy25

5

有趣 - 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项目。 This page提供了各种各样的解释:

如果您ItemsControl.ItemsPanelItemsStackPanelItemsWrapGrid,提供为SelectTemplateCore(Object)方法的重写。如果ItemsPanel是不同的面板,例如VirtualizingStackPanelWrapGrid,请为SelectTemplateCore(Object, DependencyObject)方法提供覆盖。

+0

科里打了你几分钟,但你的文档链接是有帮助的。 – Cleverguy25

0

这里的文档是这么说:

备注

如果您ItemsControl.ItemsPanel是ItemsStackPanel或ItemsWrapGrid,提供了SelectTemplateCore(Object)方法的重写。如果ItemsPanel是另一个面板,如VirtualizingStackPanel或WrapGrid,则为SelectTemplateCore(Object,DependencyObject)方法提供覆盖。

相关问题