UWP ListView, другой шаблон элемента для первого и последнего элемента

Я пытаюсь построить DataTemplateSelector, чтобы выбрать другой шаблон элемента для моего первого и последнего элемента ListView.

В моем DataTemplateSelector я пытаюсь найти родительский ListView и на основе этого индекса элемента проверки и выбрать правильный шаблон данных.

Проблема в том, что я не могу получить родительский ListView, так как в объекте контейнера DependencyObject SelectTemplateCore() родительский объект имеет значение null.

Как выбрать другой шаблон в зависимости от позиции товара?

Мой 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;
    }
}

ListView в xaml:

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

1 ответ

Решение

Нашел проблему в моем оригинальном 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);
    }
}
Другие вопросы по тегам