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);
}
}