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

时间:2016-03-19 20:35:36

标签: xaml listview win-universal-app datatemplateselector

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

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

问题是我无法像在SelectTemplateCore()中那样获取父ListView,DependencyObject容器对象的父对象是空的。

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

我的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)
    {
        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">

1 个答案:

答案 0 :(得分:1)

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

这里有更新,修复,DataTemplateSelector:

{{1}}