UWP:DataTemplateSelector和SelectedItem [英] UWP: DataTemplateSelector and SelectedItem

查看:56
本文介绍了UWP:DataTemplateSelector和SelectedItem的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在 UWP 项目中为 ListView SelectedItem 更改 DataTemplate ?我正在尝试使用 DataTemplateSelector ,但问题是 SelectTemplateCore 仅被调用了一次.

How can I change the DataTemplate for the SelectedItem of ListView in UWP project? I'm trying to use the DataTemplateSelector but the problem is that SelectTemplateCore is called only one time.

这是我尝试过的:

MyTemplateSelector类

MyTemplateSelector class

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

页面资源

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

推荐答案

一种方法是使用RegisterPropertyChangedCallback监视IsSelected属性的更改,然后手动更新ListViewItemContentTemplateSelector-

One way is to use RegisterPropertyChangedCallback to monitor the changes of the IsSelected property and then update the ContentTemplateSelector of the ListViewItem manually -

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

这篇关于UWP:DataTemplateSelector和SelectedItem的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆