我有以下DataGrid(简化)
<DataGrid ItemsSource="{Binding Something}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Test">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid>
<TextBox Text="{Binding A}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding A}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Test">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid>
<TextBox Text="{Binding B}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding B}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</Datagrid>
有没有办法将DataTemplate移动到资源并将其重用于不同的属性,因此我不必为每个属性复制和粘贴DataTemplate?
答案 0 :(得分:4)
一个实用的解决方案是在资源级别定义模板,并将它们包装在每列的“ContentPresenter”中。您仍然必须明确定义每列的模板。您仍然可以在一个位置管理模板,并快速查看列绑定的属性。
<DataGrid>
<!-- Templates in a single place in resources -->
<DataGrid.Resources>
<DataTemplate x:Key="CellTemplate">
<TextBlock Text="{Binding}" />
</DataTemplate>
<DataTemplate x:Key="EditCellTemplate">
<TextBlock Text="{Binding}" />
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding A}" ContentTemplate="{StaticResource CellTemplate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding A}" ContentTemplate="{StaticResource EditCellTemplate}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding B}" ContentTemplate="{StaticResource CellTemplate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding B}" ContentTemplate="{StaticResource EditCellTemplate}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
答案 1 :(得分:2)
你可以这样做:
<DataGrid ItemsSource="{Binding Something}">
<DataGrid.Resources>
<DataTemplate x:key="MyTemplate">
<Grid>
<TextBox Text="{Binding}"/>
</Grid>
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Test"
CellTemplate="{StaticResource MyTemplate}"
>
</DataGridTemplateColumn>
</DataGrid.Columns>
</Datagrid>
但是你需要重新考虑绑定逻辑,因为你需要在同一个模板中为所有列使用cell datacontext。