2016-01-21 59 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)方法提供覆蓋。

相關問題