c# – 如何在WPF中动态创建数据网格?
发布时间:2020-12-16 01:54:27 所属栏目:百科 来源:网络整理
导读:我在XAML中有以下数据网格: DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="Fals
我在XAML中有以下数据网格:
<DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" > <DataGrid.ColumnHeaderStyle> <Style TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontSize" Value="12" /> </Style> </DataGrid.ColumnHeaderStyle> <DataGrid.Columns> <DataGridTextColumn Header="Type" Width="200" FontSize="12" Binding="{Binding Path=Name}" /> <DataGridTemplateColumn Header="Ingredients" Width="*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <DataGrid ItemsSource="{Binding Ingredients}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" > <DataGrid.ColumnHeaderStyle> <Style TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontSize" Value="12" /> </Style> </DataGrid.ColumnHeaderStyle> <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> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> 我试图找到一种动态创建数据网格的方法(在代码中),以便我可以创建它的多个副本并在运行时将其绑定到不同的数据源. 这可能吗?任何人都知道我怎么能像这样复杂的数据网格呢? 解决方法
首先,将尽可能多的不同设置移动到可重用的Styles和DataTemplates中,在DataGrid本身中留下很少的东西:
<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> 然后,使用现有样式在代码隐藏中创建新的DataGrids变得更加容易: 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 = ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |