WPF数据网格列在样式或资源中。

22

是否有可能在样式或资源中声明 DataGrid 列? 我想要做类似于这样的事情:

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

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

我的原因是要在4个不同的 DataGrids 上共享列定义。有没有办法实现这一点?最好不要使用代码后台!


1
我猜这取决于Datagrid提供程序... 我知道Xceed datagrid允许在资源中定义列,但我不知道其他的。你用的是哪一个?WPF工具包? - Bruno
我正在使用.NET 4 WPF DataGrid。 - Daniel Bişar
3个回答

29

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>


1
这对我来说是一个很好的解决方案,可以避免一遍又一遍地复制和粘贴相同的列定义。虽然我觉得 x:Shared 没有出现在智能感知中有点奇怪,但它仍然可以很好地工作。 - wangburger
以前从未了解过共享资源...对我解决了多个问题,包括为多个数据网格重复使用数据网格列,非常感谢。 - TCC

24

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>

好的,这似乎可以解决问题。但是我如何将样式应用于ContentControl的内容(实际上是DataGrid)? - Daniel Bişar
请发布一个新的问题,评论中很难回答。 - Wallstreet Programmer

5
我认为在这种情况下,您不能够指定模板或样式,因为您实际上正在使用 Column 对象。当共享数据网格时,我认为数据网格的表现不佳;您可能会得到以下异常:"This UIElement is already the child of another UIElement"。

所以我尝试了以下方法...与您所说的略有不同。但是我遇到了以下异常:

{"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"}

使用以下 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>

2
谢谢您发布这篇文章,即使它没有回答问题。异常文本的包含帮助我找到了我需要的答案(x:Shared="False")。 - Malachi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接