2016-01-21 19 views
8

私は少し前にWPFプログラミングをやったことがありますが、私はUWPでxamlに戻っていますが、これはうまくいくと思います。基本的には、ListViewコントロールではなく、ItemsControlを使用したい(一部のデータをリストしたいので、選択したくないため)。ここに私の資源である:ここではItemsControl and ItemTemplateSelector in Windows 10 UWPアプリケーション

<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に切り替えると正常に動作します。

提案がありますか?

+0

最近私のアプリの同じ問題がありました!これが解けるかどうかわかりません... – Depechie

答えて

9

使用:

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 

これが呼び出されます1、いない第二のパラメータなしの1です。

+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.ItemsPanelItemsStackPanelまたはItemsWrapGridある場合は、SelectTemplateCore(Object)メソッドのオーバーライドを提供しています。 ItemsPanelVirtualizingStackPanelまたはWrapGridなどの異なるパネルの場合は、SelectTemplateCore(Object, DependencyObject)メソッドのオーバーライドを指定します。ここで

+0

コリーは数分でそれを打ち負かしましたが、ドキュメントへのリンクが役立ちました。 – Cleverguy25

0

ドキュメントはこう言われる、

備考

をごItemsControl.ItemsPanelがItemsStackPanelまたはItemsWrapGridであれば、SelectTemplateCore(Object)メソッドのオーバーライドを提供。 ItemsPanelがVirtualizingStackPanelやWrapGridなどの別のパネルである場合は、SelectTemplateCore(Object、DependencyObject)メソッドのオーバーライドを指定します。

関連する問題