Xaml UWP ListView,第一个和最后一个项目的不同项目模板

Xaml UWP ListView,第一个和最后一个项目的不同项目模板,xaml,listview,win-universal-app,datatemplateselector,Xaml,Listview,Win Universal App,Datatemplateselector,我正在尝试构建DataTemplateSelector,以便为我的ListView第一个和最后一个项目选择不同的项目模板 在我的DataTemplateSelector中,我尝试查找父ListView,并根据该检查项索引选择正确的数据模板 问题是我无法获取父ListView,因为SelectTemplateCore()DependencyObject容器对象的父对象为null 如何根据项目位置选择不同的模板 我的数据模板选择器: public类FirstLastDataTemplateSele

我正在尝试构建DataTemplateSelector,以便为我的ListView第一个和最后一个项目选择不同的项目模板

在我的DataTemplateSelector中,我尝试查找父ListView,并根据该检查项索引选择正确的数据模板

问题是我无法获取父ListView,因为SelectTemplateCore()DependencyObject容器对象的父对象为null

如何根据项目位置选择不同的模板

我的数据模板选择器:

public类FirstLastDataTemplateSelector:DataTemplateSelector
{
公共数据模板DefaultTemplate{get;set;}
公共数据模板FirstItemTemplate{get;set;}
公共数据模板LastItemTemplate{get;set;}
受保护的覆盖数据模板SelectTemplateCore(对象项,DependencyObject容器)
{
var lv=GetListView(容器);
如果(lv!=null)
{
var i=lv.Items.IndexOf(项目);
如果(i==0)
{
返回FirstItemTemplate;
}
else if(i==lv.Items.Count-1)
{
返回LastItemTemplate;
}
}
返回默认模板;
}
公共静态ListView GetListView(DependencyObject元素)
{
if(元素为ListView)
{
返回(ListView)元素;
}
var r=VisualTreeHelper.GetChildrenCount(元素);
for(int i=0;i
xaml中的列表视图:

<ListView ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False">
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 ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False">
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 ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False">
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);
    }
}

能否更改第一个和最后一个项目的类型(使用继承器或包装器)?您将有一个简单得多的任务。我可以更改列表项的类型,但在这种情况下,我不想触摸实际的列表项对象(如果可能的话)。我在WP8(silverlight)应用程序中使用过这种模板选择器解决方案,但现在我无法获取父列表视图。您是否尝试过使用xamlspy检查列表?它应该向您展示它是如何构建的,您可以据此调整代码。可能其中某个地方有一个不同的ItemsControl,您需要检查它,而不是ListVIew。根据源的不同,列表视图可以以完全不同的方式显示。分组尤其会导致这种行为。谢谢!我只是注意到我这样做完全是错误的。当我实际需要父项时,我正在尝试查找子项(VisualTreeHelper.GetChild())。您能更改第一个和最后一个项的类型(使用继承器或包装器)吗?您将有一个简单得多的任务。我可以更改列表项的类型,但在这种情况下,我不想触摸实际的列表项对象(如果可能的话)。我在WP8(silverlight)应用程序中使用过这种模板选择器解决方案,但现在我无法获取父列表视图。您是否尝试过使用xamlspy检查列表?它应该向您展示它是如何构建的,您可以据此调整代码。可能其中某个地方有一个不同的ItemsControl,您需要检查它,而不是ListVIew。根据源的不同,列表视图可以以完全不同的方式显示。分组尤其会导致这种行为。谢谢!我只是注意到我这样做完全是错误的。当我真正需要父对象时,我正在尝试查找子对象(VisualTreeHelper.GetChild())。。。。