更新时间:2023-11-12 08:45:28
首先,将尽可能多的不同设置移到可重用的Styles
和 DataTemplates
中,留下DataGrid 本身很少:
First, move as much as possible of the different settings out into reusable Styles
and DataTemplates
, leaving very little in the DataGrid itself:
<UserControl ... >
<UserControl.Resources>
<Style x:Key="GridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="FontSize" Value="12" />
</Style>
<Style x:Key="ReadOnlyGridStyle" TargetType="{x:Type DataGrid}" >
<Setter Property="AutoGenerateColumns" Value="False" />
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="GridLinesVisibility" Value="None" />
<Setter Property="CanUserAddRows" Value="False" />
<Setter Property="CanUserDeleteRows" Value="False" />
<Setter Property="CanUserResizeColumns" Value="False" />
<Setter Property="CanUserResizeRows" Value="False" />
<Setter Property="CanUserReorderColumns" Value="False" />
<Setter Property="ColumnHeaderStyle" Value="{StaticResource GridHeaderStyle}" />
</Style>
<DataTemplate x:Key="IngredientsCellTemplate" >
<DataGrid ItemsSource="{Binding Ingredients}"
Style="{StaticResource ReadOnlyGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Ingredients" Width="*" FontSize="12"
Binding="{Binding Path=IngredientName}" />
<DataGridTextColumn Header="Quantite" Width="*" FontSize="12"
Binding="{Binding Path=Qty}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</UserControl.Resources>
<!-- A DataGrid using our Styles: -->
<DataGrid ItemsSource="{Binding View}"
Style="{StaticResource ReadOnlyGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Width="200" FontSize="12"
Binding="{Binding Path=Name}" />
<DataGridTemplateColumn Header="Ingredients" Width="*"
CellTemplate="{StaticResource IngredientsCellTemplate}" />
</DataGrid.Columns>
</DataGrid>
</UserControl>
然后使用现有样式在代码隐藏中创建新的 DataGrid 变得容易得多:
Then it gets a lot easier to create new DataGrids in your code-behind, using the existing Styles:
var datagrid = new DataGrid();
datagrid.Style = FindResource("ReadOnlyGridStyle") as Style;
datagrid.Columns.Add(new DataGridTextColumn()
{
Header = "Type",
Width = new DataGridLength(200),
FontSize = 12,
Binding = new Binding("Name")
});
datagrid.Columns.Add(new DataGridTemplateColumn()
{
Header = "Ingredients",
Width = new DataGridLength(1, DataGridLengthUnitType.Star),
CellTemplate = FindResource("IngredientsCellTemplate") as DataTemplate
});
datagrid.ItemsSource = ...