我试图构建 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">