我试图建立DataTemplateSelector为我的ListView的第一个和最后一个项目选择不同的项目模板。
在我的DataTemplateSelector中,我尝试找到父ListView并基于该检查项目索引并选择正确的数据模板。
问题是我无法像在SelectTemplateCore()DependencyObject容器对象的父级中那样获得父级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)
{
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">
在我原来的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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句