WPF DataGrid Columns in Style or resource

Is it possible to declare DataGrid columns in a style or as a resource? I would like to do something like this:

<....Resources>
    <DataGridColumns x:Key="dgcDataGridColumns">
        <DataGridTextColumn />
        <DataGridTextColumn />
    </DataGridColumns
</....Resources>

<DataGrid Columns="{StaticResource dgcDataGridColumns}" />

The reason is that i have to share the column definition for 4 different DataGrids. Any way to achieve this? Best would be without code behind!

Answers


Columns property of the DataGrid has no setter so it is not possibly. You can however do something like this:

<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>

x:Shared helps to avoid the exception MattS423 has got.

<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>


I don't think you can, as in that situation you aren't specifying a template or a style, but the actual Column object. I don't think the data grids play nicely when sharing like that; I think you'll get an exception to the extent of "This UIElement is already the child of another UIElement".

So I tried the following...slightly different than what you're talking about. but I got this exception:

{"DataGridColumn with Header '' already exists in the Columns collection of a DataGrid. DataGrids cannot share columns and cannot contain duplicate column instances.\r\nParameter name: item"}

with this 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>

Need Your Help

How do I get actual image width and height using jQuery?

jquery image

On a page I have displayed 100 images, which have the width

PHP: Best way to check if input is a valid number?

php input validation numeric

What is the best way of checking if input is numeric?