0

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

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

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

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

我的数据模板选择器:

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 ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False">
4

1 回答 1

2

在我原来的 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);
    }
}
于 2016-03-20T17:32:42.297 回答