C# 如何在ListView中为每个组应用不同的数据模板

C# 如何在ListView中为每个组应用不同的数据模板,c#,xaml,listview,uwp,datatemplateselector,C#,Xaml,Listview,Uwp,Datatemplateselector,在listview中,是否可以为每个组应用不同的数据模板,我可以使用HeaderTemplateSelector,但如何使用GroupTemplateSelector 下面是我为组的HeaderTemplateSelector所做的代码 <DataTemplate x:Key="Template1"> <StackPanel Margin="0.5"> <TextBlock Text="{Binding Path=Key}" />

在listview中,是否可以为每个组应用不同的数据模板,我可以使用HeaderTemplateSelector,但如何使用GroupTemplateSelector

下面是我为组的HeaderTemplateSelector所做的代码

<DataTemplate x:Key="Template1">
    <StackPanel Margin="0.5">
        <TextBlock Text="{Binding Path=Key}" />
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="Template2">
    <StackPanel Margin="10">
        <TextBlock Text="{Binding Path=Key}" />
    </StackPanel>
</DataTemplate>

<ListView.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplateSelector>
            <local:GroupTemplateSelector Template1="{StaticResource Template1}"
                                         Template2="{StaticResource Template2}" />
        </GroupStyle.HeaderTemplateSelector>
    </GroupStyle>
</ListView.GroupStyle>

#

公共类GroupTemplateSelector:DataTemplateSelector
{
公共数据模板模板1{get;set;}
公共数据模板模板2{get;set;}
受保护的覆盖数据模板SelectTemplateCore(
对象项,
DependencyObject(对象容器)
{
如果(项!=null)
{
var group=作为I分组的项目;
开关(组键)
{
案例“否”:
返回模板1;
案例“是”:
返回模板2;
}
}
返回基地。选择模板(项目、容器);
}
}

如何为组内容执行不同的选择器

您只需实现一个
ListView.ItemTemplateSelector
,并在其
SelectTemplateCore
中获取
MyClass
实例,检查它属于哪个组,并相应地选择模板。为了获得最佳性能,最好是
MyClass
有一个快速的方法(例如,一个属性),您可以通过它告诉团队

public class GroupTemplateSelector : DataTemplateSelector
{
    public DataTemplate Template1 { get; set; }
    public DataTemplate Template2 { get; set; }

    protected override DataTemplate SelectTemplateCore(
        object item, 
        DependencyObject container)
    {
        if (item != null)
        {
            var group = item as IGrouping<string, MyClass>;
            switch (group.Key)
            {
                case "No":
                    return Template1;
                case "Yes":
                    return Template2;
            }
        }

        return base.SelectTemplate(item, container);
    }
}