UWP ListView,第一个和最后一个项目的不同项目模板
UWP ListView, different item template for first and last item
我正在尝试构建 DataTemplateSelector 以便为我的 ListView 第一个和最后一个项目选择不同的项目模板。
在我的 DataTemplateSelector 中,我尝试找到父 ListView 并根据该检查项索引选择正确的数据模板。
问题是我无法获取父 ListView,因为 SelectTemplateCore() DependencyObject 容器对象的父对象为空。
如何根据项目位置选择不同的模板?
我的数据模板选择器:
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);
}
}
我正在尝试构建 DataTemplateSelector 以便为我的 ListView 第一个和最后一个项目选择不同的项目模板。
在我的 DataTemplateSelector 中,我尝试找到父 ListView 并根据该检查项索引选择正确的数据模板。
问题是我无法获取父 ListView,因为 SelectTemplateCore() DependencyObject 容器对象的父对象为空。
如何根据项目位置选择不同的模板?
我的数据模板选择器:
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);
}
}