在资源文件中定义列表视图,仅更改 ItemSource

Define listview in resource file with only ItemSource changing

我创建了以下 ListView 来显示一些数据(删除了无关的标记):

<ListView ItemsSource="{Binding NewYorkResidents}">
    <ListView.Header>
        <Style>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        </Style>
    </ListView.Header>
    <ListView.HeaderTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="60"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="Name" Grid.Column="0" />
                <TextBlock Text="Address" Grid.Column="1" />
            </Grid>
        </DataTemplate>
    </ListView.HeaderTemplate>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="60"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}" Grid.Column="0" />
                <TextBlock Text="{Binding Address}" Grid.Column="1" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

现在我想在不同的视图中重用这个完全相同的 ListView + 标记,只是使用不同的 ItemsSource(尽管它将绑定到相同的数据类型)。

重用 ListView 并仅指定 ItemsSource 的最佳方法是什么?我希望能够做这样的事情:

<ListView DataTemplate="MyTemplate" ItemsSource=<some new binding> />

并且仍然使用来自 ItemsSource 的数据显示 ListView headers 以及名称和地址文本块。

制作 ControlTemplate 似乎不是正确的事情,因为我也在列表视图中指定实际数据(例如绑定到名称和地址)。

是否有更好的方法来创建某种类型的资源以便我可以重用它?

在资源字典中定义页眉模板和项目模板,并在您的代码中添加对它们的引用。您可以重复使用此模板。

   <DataTemplate x:Key="HeaderTemplate1">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="60"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="Name" Grid.Column="0" />
            <TextBlock Text="Address" Grid.Column="1" />
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="ListViewTemplate1">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="60"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Name}" Grid.Column="0" />
            <TextBlock Text="{Binding clothing1}" Grid.Column="1" />
        </Grid>
    </DataTemplate>

  <ListView HeaderTemplate="{StaticResource HeaderTemplate1}" ItemTemplate="{StaticResource ListViewTemplate1}"/>

有关项目模板的更多信息: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/listview-item-templates