2011-04-19 144 views
17

是否可以在风格或资源中声明DataGrid列? 我愿做这样的事情:WPF DataGrid风格或资源中的列

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

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

的原因是,我给大家分享列定义为4个不同的DataGrids。任何方式来实现这一目标?最好的是没有代码背后!

+1

我想这取决于Datagrid的供应商...我知道,Xceed数据网格允许资源定义列,但我不知道其他人。你在使用哪一个? WPF工具包一个? – Bruno 2011-04-19 12:45:23

+0

我正在使用.NET 4 WPF DataGrid – SACO 2011-04-20 07:31:25

回答

20

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

好吧,这似乎是伎俩。但是,我如何将一个样式应用于内容控件的内容(实际上到DataGrid)? – SACO 2011-04-20 07:42:45

+0

请发表新评论,难以回答。 – 2011-04-20 13:17:40

+0

http://stackoverflow.com/questions/5731276/wpf-contentcontrol-styling – SACO 2011-04-20 13:40:54

4

我不认为你可以,因为在那种情况下,你没有指定模板或样式,而是实际的Column对象。当我这样分享数据时,我认为数据网格不会很好地发挥作用;我认为你会得到一个例外,“这个UIElement已经是另一个UIElement的孩子”。

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

{“的DataGridColumn与头‘’已存在在DataGrid的列集合的DataGrid无法共享列,不能包含重复的列实例\ r \ n参数名:项目”}

与此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> 
+1

感谢您发表本文,即使它没有回答这个问题。包含例外文本帮助我找到了我需要的答案(x:Shared =“False”)。 – Malachi 2012-11-19 22:33:28

24

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> 

+1

这是一个很好的解决方案,以避免复制和粘贴相同的列定义反复。我发现奇怪的是x:Shared虽然没有出现在intellisense中,但是效果都很好 – wangburger 2011-07-21 14:56:07

+0

从来没有新的关于资源共享......为我解决了多个问题,包括为多个数据网格重复使用datagrid列,非常感谢 – TCC 2014-01-17 22:05:38