Подтвердить что ты не робот

Как повторно использовать WPF DataGridTemplateColumn (включая привязку)

В datagrids 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>

Для простого примера, как я могу применить тот же шаблон, который используется для столбца с заголовком = Имя, к столбцу с заголовком = Company, без необходимости воспроизводить весь шаблон для каждого столбца?

Я нашел ответ с этот предыдущий вопрос SO, где они объясняют использование таких ресурсов, как:

<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%, но последний фрагмент, который мне не хватает, - как обрабатывать привязку данных? Как создать какой-либо тип владельца места в шаблоне, а затем выполнить фактическое привязку в сетке?

ИЗМЕНИТЬ Я продолжал искать и нашел вопрос Создать общую DataGridTemplateColumn, которая звучит так, как я хочу сделать, на самом деле может быть в настоящее время невозможна. Поэтому, если кто-либо еще пытается это сделать, и видит этот вопрос, я не могу гарантировать, что это невозможно, но по этой ссылке кажется, что это возможно. Поэтому просто нужно будет дублировать весь код tempalte для каждого столбца.

4b9b3361

Ответ 1

Вы можете установить для свойства CellStyle стиль, который перезаписывает Template для DataGridCell.

В Template используйте ContentPresenter, привязанный к TemplatedParent.Content везде, где вы хотите разместить содержимое 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>