2017-05-29 9 views
1

がどのように私はUWPプロジェクトにのSelectedItemのリストビューためのDataTemplateを変更できますか?私はDataTemplateSelectorを使用しようとしていますが、問題はです。SelectTemplateCoreは1回だけ呼び出されます。UWP:DataTemplateSelectorとのSelectedItem

私が試してみました何これを:

MyTemplateSelectorクラス

<Page.Resources> 
    <DataTemplate x:Key="DefaultTemplate"> 
     <Grid Height="44"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="44" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <SymbolIcon Grid.Column="0" Symbol="{Binding Icon, Mode=OneWay}" Foreground="Black" 
         Height="40" Width="40" Margin="2"/> 
      <TextBlock Grid.Column="1" Text="{Binding Name, Mode=OneWay}" FontSize="16" VerticalAlignment="Center" Foreground="Black" /> 
     </Grid> 
    </DataTemplate> 
    <DataTemplate x:Key="SelectedItemTemplate"> 
     <Grid Height="44" Background="Black"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="44" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <SymbolIcon Grid.Column="0" Symbol="{Binding Icon, Mode=OneWay}" Foreground="Black" 
         Height="40" Width="40" Margin="2"/> 
      <TextBlock Grid.Column="1" Text="{Binding Name, Mode=OneWay}" FontSize="16" VerticalAlignment="Center" Foreground="Black" /> 
     </Grid> 
    </DataTemplate> 
    <local:DefaultTemplateSelector x:Key="TemplateSelector" 
            DefaultTemplate="{StaticResource DefaultTemplate}" 
            SelectedItemTemplate="{StaticResource SelectedItemTemplate}"/> 
</Page.Resources> 

のListView

<ListView x:Name="MyListView" ItemContainerStyle="{StaticResource DefaultStyle}" ItemTemplateSelector="{StaticResource TemplateSelector}"> 
</ListView> 

答えて

1

一つの方法は、を使用することですページの

public class MyTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DefaultTemplate { get; set; } 
    public DataTemplate SelectedItemTemplate { get; set; } 
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
    { 
     var cont = container as ListViewItem; 
     if (cont != null) 
     { 
      FrameworkElement elemnt = container as FrameworkElement; 
      if (cont.IsSelected) 
      { 
       return SelectedItemTemplate; 
      } 
      else 
      { 
       return DefaultTemplate; 
      } 
     } 
     else 
      return DefaultTemplate; 
    } 
} 

リソースIsSelectedプロパティの変更を監視し、手動でListViewItemContentTemplateSelectorを更新する210 -

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
{ 
    if (container is ListViewItem cont) 
    { 
     if (cont.Tag != null && long.TryParse(cont.Tag.ToString(), out var token)) 
     { 
      cont.UnregisterPropertyChangedCallback(ListViewItem.IsSelectedProperty, token); 
     } 

     cont.Tag = cont.RegisterPropertyChangedCallback(ListViewItem.IsSelectedProperty, (s, e) => 
     { 
      cont.ContentTemplateSelector = null; 
      cont.ContentTemplateSelector = this; 
     }); 

     if (cont.IsSelected) 
     { 
      return SelectedItemTemplate; 
     } 

     return DefaultTemplate; 
    } 

    return DefaultTemplate; 
} 
+1

が、それは動作しますが、ありがとうございます! – Amine

+0

あなたもこの[回答](https://stackoverflow.com/a/44590468/231837)に興味があるかもしれません。 :) –

関連する問題