Столбцы DataGrid WPF в стиле или ресурсе - PullRequest
19 голосов
/ 19 апреля 2011

Можно ли объявить DataGrid столбцы в стиле или в качестве ресурса?Я хотел бы сделать что-то вроде этого:

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

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

Причина в том, что я должен разделить определение столбца для 4 различных DataGrids.Есть ли способ добиться этого?Лучше всего было бы без кода!

Ответы [ 3 ]

27 голосов
/ 19 апреля 2011

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>

21 голосов
/ 19 апреля 2011

Свойство Columns 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>
4 голосов
/ 19 апреля 2011

Не думаю, что вы можете, так как в этой ситуации вы указываете не шаблон или стиль, а фактический объект 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...