gpt4 book ai didi

wpf - 如何重用 WPF DataGridTemplateColumn(包括绑定(bind))

转载 作者:行者123 更新时间:2023-12-03 23:51:08 25 4
gpt4 key购买 nike

在 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%,但我缺少的最后一点是如何处理数据绑定(bind)?如何在模板中创建某种类型的占位符,然后在网格中进行实际绑定(bind)?

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

最佳答案

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

Template , 使用 ContentPresenter绑定(bind)到 TemplatedParent.ContentTemplatedParent 开始,您想要放置 DataGridCell 的内容的任何位置是 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>

关于wpf - 如何重用 WPF DataGridTemplateColumn(包括绑定(bind)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11849460/

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