web-dev-qa-db-ja.com

スタイルまたはリソースのWPFDataGrid列

DataGrid列をスタイルで、またはリソースとして宣言することは可能ですか?私はこのようなことをしたいと思います:

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

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

その理由は、4つの異なるDataGridsの列定義を共有する必要があるためです。これを達成する方法はありますか?コードが背後にないのが最善です!

20
Daniel Bişar

DataGridのColumnsプロパティにはセッターがないため、セッターがない可能性があります。ただし、次のようなことができます。

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

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

そのような状況では、テンプレートやスタイルではなく、実際のColumnオブジェクトを指定しているので、できるとは思いません。そのように共有する場合、データグリッドはうまく機能しないと思います。 「このUIElementはすでに別のUIElementの子です」という範囲で例外が発生すると思います。

だから私は以下を試しました...あなたが話しているものとは少し異なります。しかし、私はこの例外を受け取りました:

{"ヘッダー付きのDataGridColumn ''はDataGridのColumnsコレクションに既に存在します。DataGridsは列を共有できず、重複する列インスタンスを含めることはできません。\ r\nパラメーター名: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>
4
MattS423