4

我有一些ListView绑定到 ViewModel 中的集合。这些集合中的项目类型是相同的(我们称它们为TypeA),这是一个公开多个简单类型属性的类。我想将它们显示GridViewListView. 自然,我想为此定义一个DataTemplateTypeA这样我就不必为每个ListView' 复制相同的 XAML。到目前为止,我发现的所有示例都定义ItemTemplateListView. 如何创建资源并让不同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>

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

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

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

4

2 回答 2

4

您甚至不必定义资源键,只需设置 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>
于 2013-09-19T09:45:10.763 回答
-1

只需DataTemplate像在 ListViews ItemTemplate 中一样在 Controls/Windows 资源中创建并添加x:Key="someKey"它。

现在你可以像这样引用它:

<ListView ItemTemplate="{StaticResource someKey}"/> 
于 2013-09-19T09:39:37.297 回答