gpt4 book ai didi

wpf - 如何为 GridView(在 ListView 内)定义 ItemTemplate,以便它可以在多个不同的 ListView 中使用?

转载 作者:行者123 更新时间:2023-12-01 01:05:43 26 4
gpt4 key购买 nike

我有一些 ListView绑定(bind)到 ViewModel 中的集合。这些集合中的项目类型是相同的(我们称它们为 TypeA),这是一个公开多个简单类型属性的类。我想在 GridView 中显示它们里面ListView .当然,我想定义一个 DataTemplate为此TypeA这样我就不必为每个 ListView 复制相同的 XAML的。到目前为止,我发现的所有示例都定义了 ItemTemplate里面ListView .如何制作资源并让不同的ListView是指这个单一的资源?

更新:

我发布了我的 XAML 代码以进行更好的说明。我的原始 XAML 代码(简化)如下所示:

<ListView ItemsSource="{Binding MYCOLLECTION}" SelectionMode="Extended" >                                                                       
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Prop1}" >
<GridViewColumn.Header>
<Border >
<TextBlock Text="Prop1" />
</Border>
</GridViewColumn.Header>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Prop2}" >
<GridViewColumn.Header>
<Border >
<TextBlock Text="Prop2" />
</Border>
</GridViewColumn.Header>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Prop3}" >
<GridViewColumn.Header>
<Border >
<TextBlock Text="Prop3" />
</Border>
</GridViewColumn.Header>
</GridViewColumn>
...
</GridView>
</ListView.View>
</ListView>

我为标题设置了许多依赖项属性,这就是为什么我放置单个标题项以及为什么我的代码真的很长的原因——因此我寻求使用数据模板。

所以我的想法是我可以在不同的 GridView中以相同的方式显示相同类型的不同选择。 's(因为我们希望列标题显示属性的名称,所以我们使用 GridView )。

顺便说一句,这些不是我展示这种数据类型的唯一地方,所以我肯定需要指定一个 Resource 键并将其限制为仅用于 GridView。而且因为我想以网格方式显示,我假设无法定义 DataTemplate对于我的类型并将其用作 ItemTemplateListView .

最佳答案

您甚至不必定义资源键,只需设置 DataType,因为它将在 WPF 内部用作键。只要确保您的数据模板在您想要使用它的任何控件中都是可见的,它们将被自动应用。 (例如,您可以在 App.xaml 的资源中的应用程序级别定义它们,但您可能有单独的资源字典):

<Application x:Class="WpfTest.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dataModel="clr-namespace:DataModel"
StartupUri="MainWindow.xaml">
<Application.Resources>
<DataTemplate DataType="{x:Type dataModel:GreekGod}">
<TextBlock Text="{Binding Path=Name}" Foreground="Gold"/>
</DataTemplate>
</Application.Resources>
</Application>

对于您的代码,您需要为每个属性定义模板,因为您将其用作网格,并且您需要在删除 DisplaymemberBinding 后为每列设置单元格模板:
               <GridViewColumn CellTemplate="{StaticResource prop1Template}">
<GridViewColumn.Header>
<Border >
<TextBlock Text="Prop1" />
</Border>
</GridViewColumn.Header>
</GridViewColumn>
...

并将资源放在可见的位置,就像之前在应用程序资源中提到的那样:
                <Application.Resources>
<DataTemplate x:Key="prop1Template">
<TextBlock Text="{Binding Prop1}" Foreground="Red"/>
</DataTemplate>
</Application.Resources>

您可以像这样使用 ColumnHeaderTemplate 和 ColumnContainerStyle:
     <GridView
ColumnHeaderTemplate="{StaticResource myHeaderTemplate}"
ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}"
>
<GridViewColumn Header="Prop1" CellTemplate="{StaticResource prop1Template}"/>
...

例如,资源在哪里:
    <Style x:Key="myHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="LightBlue"/>
</Style>

<DataTemplate x:Key="myHeaderTemplate">
<DockPanel>
<CheckBox/>
<TextBlock FontSize="16" Foreground="DarkBlue">
<TextBlock.Text>
<Binding/>
</TextBlock.Text>
</TextBlock>
</DockPanel>
</DataTemplate>

关于wpf - 如何为 GridView(在 ListView 内)定义 ItemTemplate,以便它可以在多个不同的 ListView 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18891036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com