UWP ListView,第一个和最后一个项目的不同项目模板

UWP ListView, different item template for first and last item

我正在尝试构建 DataTemplateSelector 以便为我的 ListView 第一个和最后一个项目选择不同的项目模板。

在我的 DataTemplateSelector 中,我尝试找到父 ListView 并根据该检查项索引选择正确的数据模板。

问题是我无法获取父 ListView,因为 SelectTemplateCore() DependencyObject 容器对象的父对象为空。

如何根据项目位置选择不同的模板?

我的数据模板选择器:

public class FirstLastDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate DefaultTemplate { get; set; }
    public DataTemplate FirstItemTemplate { get; set; }
    public DataTemplate LastItemTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        var lv = GetListView(container);
        if (lv != null)
        {
            var i = lv.Items.IndexOf(item);
            if (i == 0)
            {
                return FirstItemTemplate;
            }
            else if (i == lv.Items.Count - 1)
            {
                return LastItemTemplate;
            }
        }
        return DefaultTemplate;
    }

    public static ListView GetListView(DependencyObject element)
    {
        if (element is ListView)
        {
            return (ListView)element;
        }
        var r = VisualTreeHelper.GetChildrenCount(element);
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            var child = VisualTreeHelper.GetChild(element, i);

            var result = GetListView(child);
            if (result == null)
            {
                continue;
            }
            else
            {
                return result;
            }
        }
        return null;
    }
}

xaml 中的 ListView:

<ListView ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False">

在我原来的DataTemplateSelector 中发现了问题。尽管我实际上需要父 ListView,但我试图找到子对象。

这里更新,修复,DataTemplateSelector:

public class FirstLastDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate DefaultTemplate { get; set; }
    public DataTemplate FirstItemTemplate { get; set; }
    public DataTemplate LastItemTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        var lv = GetListView(container);
        if (lv != null)
        {
            var i = lv.Items.IndexOf(item);
            if (i == 0)
            {
                return FirstItemTemplate;
            }
            else if (i == lv.Items.Count - 1)
            {
                return LastItemTemplate;
            }
        }
        return DefaultTemplate;
    }


    public static ListView GetListView(DependencyObject element)
    {
        var parent = VisualTreeHelper.GetParent(element);
        if (parent == null)
        {
            return null;
        }
        var parentListView = parent as ListView;
        return parentListView ?? GetListView(parent);
    }
}