Столбцы WPF DataGrid в стиле или ресурсе
Можно ли объявлять столбцы DataGrid
в стиле или в качестве ресурса?
Я хотел бы сделать что-то вроде этого:
<....Resources>
<DataGridColumns x:Key="dgcDataGridColumns">
<DataGridTextColumn />
<DataGridTextColumn />
</DataGridColumns
</....Resources>
<DataGrid Columns="{StaticResource dgcDataGridColumns}" />
Причина в том, что мне нужно разделить определение столбца на 4 разных DataGrids
. Любой способ добиться этого? Лучше всего без кода!
Ответы
Ответ 1
Свойство столбцов DataGrid не имеет сеттера, поэтому оно не возможно. Однако вы можете сделать что-то вроде этого:
<Window.Resources>
<Controls:DataGrid x:Key="PersonDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding .}" x:Shared="False">
<Controls:DataGrid.Columns>
<Controls:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
<Controls:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
</Controls:DataGrid.Columns>
</Controls:DataGrid>
</Window.Resources>
<StackPanel>
<ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Customers}"></ContentControl>
<ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Employees}"></ContentControl>
</StackPanel>
Ответ 2
x: Shared помогает избежать исключения, которое имеет MattS423.
<Window.Resources>
<DataGridTextColumn x:Key="dgtcFirstName" x:Shared="False" Header="First Name" Binding="{Binding FirstName}"/>
<DataGridTextColumn x:Key="dgtcSecondName" x:Shared="False" Header="Second Name" Binding="{Binding SecondName}"/>
</Window.Resources>
<Grid>
<StackPanel>
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="200">
<DataGrid.Columns>
<StaticResource ResourceKey="dgtcFirstName"/>
<StaticResource ResourceKey="dgtcSecondName"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid2" Width="200">
<DataGrid.Columns>
<StaticResource ResourceKey="dgtcSecondName"/>
<StaticResource ResourceKey="dgtcFirstName"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Grid>
Ответ 3
Я не думаю, что вы можете, так как в этой ситуации вы не указываете шаблон или стиль, а фактический объект Column. Я не думаю, что сетки данных прекрасно работают при совместном использовании; Я думаю, вы получите исключение в размере "Этот UIElement уже является дочерним элементом другого UIElement".
Итак, я пробовал следующее... немного отличающееся от того, о чем вы говорите. но я получил это исключение:
{ "DataGridColumn with Header" уже существует в коллекции Columns DataGrid. DataGrids не может совместно использовать столбцы и не может содержать повторяющиеся экземпляры столбцов. \r\nParameter name: item "}
с этим XAML:
<Grid.Resources>
<DataGridTextColumn x:Key="MyColumn" />
</Grid.Resources>
<DataGrid>
<DataGrid.Columns>
<StaticResource ResourceKey="MyColumn" />
</DataGrid.Columns>
</DataGrid>
<DataGrid>
<DataGrid.Columns>
<StaticResource ResourceKey="MyColumn" />
</DataGrid.Columns>
</DataGrid>