我正在尝试构建DataTemplateSelector,为我的ListView第一个和最后一个项目选择不同的项目模板。
在我的DataTemplateSelector中,我尝试查找父ListView并根据该检查项索引并选择正确的数据模板。
问题是我无法像在SelectTemplateCore()中那样获取父ListView,DependencyObject容器对象的父对象是空的。
如何根据项目位置选择不同的模板?
我的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;
}
}
xaml中的ListView:
<ListView ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False">
答案 0 :(得分:1)
在我原来的DataTemplateSelector中发现了问题。我试图找到子对象,虽然我实际上需要父ListView。
这里有更新,修复,DataTemplateSelector:
{{1}}