样式或资源中的WPF DataGrid列

Dan*_*şar 19 wpf resources datagrid

是否可以DataGrid在样式或资源中声明列?我想做这样的事情:

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

<DataGrid Columns="{StaticResource dgcDataGridColumns}" />
Run Code Online (Sandbox Code Playgroud)

原因是我必须分享4种不同的列定义DataGrids.有没有办法实现这个目标?最好的是没有代码背后!

小智 28

x:共享有助于避免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>
Run Code Online (Sandbox Code Playgroud)


Wal*_*mer 21

DataGrid的Columns属性没有setter,因此不可能.但是你可以这样做:

<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>
Run Code Online (Sandbox Code Playgroud)


Mat*_*423 5

我认为您不能,因为在这种情况下您没有指定模板或样式,而是指定实际的 Column 对象。我认为数据网格在这样共享时表现不佳;我认为您会遇到“此 UIElement 已经是另一个 UIElement 的子级”的异常。

所以我尝试了以下...与你所说的略有不同。但我得到了这个例外:

{“带有标题 '' 的 DataGridColumn 已存在于 DataGrid 的 Columns 集合中。DataGrid 不能共享列,也不能包含重复的列实例。\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>
Run Code Online (Sandbox Code Playgroud)

  • 感谢您发布此内容,尽管它没有回答问题。包含异常文本帮助我找到了我需要的答案(x:Shared =“False”)。 (2认同)