devha
devha

Reputation: 3367

UWP ListView, different item template for first and last item

Im trying to build DataTemplateSelector to choose different item template for my ListView first and last item.

In my DataTemplateSelector I try to find parent ListView and based on that check item index and choose correct data template.

The problem is that im unable to get parent ListView as in the SelectTemplateCore() DependencyObject container object's parent is null.

How should I choose different template based on item position?

My 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 in xaml:

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

Upvotes: 0

Views: 1934

Answers (1)

devha
devha

Reputation: 3367

Found the problem in my original DataTemplateSelector. I was trying to find child object although I actually need the parent ListView.

Here is updated, fixed, 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);
    }
}

Upvotes: 2

Related Questions