如何重用WPF DataGridTemplateColumn(包括绑定)?[英] How to reuse WPF DataGridTemplateColumn (including binding)

本文是小编为大家收集整理的关于如何重用WPF DataGridTemplateColumn(包括绑定)?的处理方法,想解了如何重用WPF DataGridTemplateColumn(包括绑定)?的问题怎么解决?如何重用WPF DataGridTemplateColumn(包括绑定)?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

在 WPF 数据网格中,我有一个定义为 DataGridTemplateColumn 的列,我需要在各种列上使用它.作为一个非常简化的示例,请将以下内容视为虚拟示例:

<DataGrid ItemsSource="{Binding Path=ItemList, Mode=OneWay}" AutoGenerateColumns="False" >                
    <DataGrid.Columns>

        <DataGridTemplateColumn Header="Name" MinWidth="130" Width="Auto">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DockPanel LastChildFill="True">
                        <Image Source="component/Images/test.png"/>
                        <TextBlock Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
                    </DockPanel>                                
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <DockPanel LastChildFill="True">
                        <Image Source="component/Images/test.png"/>
                        <TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
                    </DockPanel>
                </DataTemplate>                            
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn Header="Company" Binding="{Binding Company, ValidatesOnDataErrors=True}" MinWidth="115" Width="Auto"/>                    
    </DataGrid.Columns>
</DataGrid>

举个简单的例子,我如何将用于 Header=Name 列的相同模板应用到 Header=Company 列,而不必为每一列复制整个模板?

我在this previous SO question中找到了答案,他们使用以下资源进行了解释:

<Application.Resources> 
     <DataTemplate x:Key="CellTemplate"> 
     ... 
     </DataTemplate> 
     <DataTemplate x:Key="CellEdintingTemplate"> 
     ... 
     </DataTemplate> 
</Application.Resources> 

<DataGrid Style="{StaticResource MainGridStyle}"> 
    <DataGrid.Columns> 
        <DataGridTemplateColumn CellTemplate="{StaticResource MyFirstColumnCellTemplate}" CellEdintingTemplate="{StaticResource MyFirstColumnCellEdintingTemplate}"/> 
        ... 
    </DataGrid.Columns> 
<DataGrid>  

这让我达到了 95%,但我缺少的最后一点是如何处理数据绑定?如何在模板中创建某种类型的占位符,然后在网格中进行实际绑定?

编辑我一直在寻找并发现问题 创建 Common DataGridTemplateColumn 听起来我想做的事情实际上目前可能是不可能的.因此,如果其他人曾经试图这样做,并且看到这个问题,我不能保证这是不可能的,但从这个链接看来它可能是.所以只需要复制每一列的所有模板代码.

推荐答案

您可以将 CellStyle 属性设置为覆盖 DataGridCell 的 Template 的样式.

在 Template 中,使用绑定到 TemplatedParent.Content 的 ContentPresenter 来放置 DataGridCell 的内容,因为 TemplatedParent 是 DataGridCell

例如,

<Style x:Key="MyCellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <Image Source="component/Images/test.png"/>
                    <ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" />
                </DockPanel>  
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<DataGrid ItemsSource="{Binding ItemList}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" CellStyle="{StaticResource MyCellStyle}" MinWidth="130" Width="Auto" />
        <DataGridTextColumn Header="Company" Binding="{Binding Company}" CellStyle="{StaticResource MyCellStyle}" MinWidth="115" Width="Auto"/>                    
    </DataGrid.Columns>
</DataGrid>

本文地址:https://www.itbaoku.cn/post/1794106.html