如何为 listView UWP C# 中的每个项目自定义 UI 或 DataTemplate

How to customize UI or DataTemplate for each item in listView UWP C#

我有一个包含不同类型项目的 listView,我需要使用 UI 中的不同元素来显示它们。例如我在 listView 中有 children 和成年成员,children 不会有孩子、配偶等,而成年人会有 children、配偶、工作场所等。据我所知,一旦我使用数据模板在 XAML 布局结构,我无法更改它。我为不同的项目创建了一个 UserControl,不确定在添加项目时如何在 ListView 中使用它。
寻求有关如何执行此操作的帮助。

提前致谢。

根据您的情况,您可以尝试使用DataTemplateSelector Class。这 class 使您可以根据自己的逻辑为 ListView 应用不同的模板。

以下是您需要执行的步骤:

  1. 您需要创建自己的 DataTemplateSelector Class。然后你可以将每个模板声明为 class.
  2. 的 属性
  3. 您需要在 XAML 文件的资源部分创建您自己的 DataTemplateSelector class 实例。您应该创建 DataTemplate 对象的实例并在资源部分定义它们的布局。然后将这些数据模板分配给您在 DataTemplateSelector class.
  4. 中声明的 模板属性
  5. 最后一步是将 DataTemplateSelector class 分配给 ListView 的 ItemTemplateSelector 属性

我做了一个简单的demo,你可以参考下面的代码:

后面的代码:

 public sealed partial class MainPage : Page
{
    public List<int> NumbersList { get; set; }

    public MainPage()
    {
        this.InitializeComponent();

        NumbersList = new List<int>();

        for (int i=0;i<10; i++) 
        {
            NumbersList.Add(i);
        }
    }
}

public class MyDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate ChildrenTemplate { get; set; }
    public DataTemplate AdultTemplateent { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        // use your own conditions
        if ((int)item % 2 == 0)
        {
            return AdultTemplateent;
        }
        else
        {
            return ChildrenTemplate;
        }
    }
}

Xaml:

 <Page.Resources>

    <DataTemplate x:Key="AdultTemplateent" x:DataType="x:Int32">
        <StackPanel Orientation="Horizontal" Background="LightGray">
            <TextBlock Text="This is Adult Item" Margin="5"/>
            <TextBlock Text="{x:Bind}" Margin="5"/>
            <TextBlock Text="Workplace:NewYork" Margin="5"/>
        </StackPanel>
      
    </DataTemplate>

    <DataTemplate x:Key="ChildrenTemplate" x:DataType="x:Int32">
        <StackPanel Orientation="Vertical" Background="LightBlue">
            <TextBlock Text="This is Children Item" Margin="5" />
            <TextBlock Text="{x:Bind}" Margin="5" />
            <TextBlock Text="School:DC" Margin="5"/>
        </StackPanel>
    </DataTemplate>

    <local:MyDataTemplateSelector x:Key="MyDataTemplateSelector"  AdultTemplateent="{StaticResource AdultTemplateent}" ChildrenTemplate="{StaticResource ChildrenTemplate}"/>

</Page.Resources>
<Grid>
    <ListView x:Name = "TestListView"
      ItemsSource = "{x:Bind NumbersList}"
      ItemTemplateSelector = "{StaticResource MyDataTemplateSelector}">
    </ListView>
</Grid>

长什么样:

您可以在这里获得更详细的信息:Data template selection: Styling items based on their properties