2011-04-19 6 views
17

Est-il possible de déclarer des colonnes DataGrid dans un style ou une ressource? Je voudrais faire quelque chose comme ceci:Colonnes WPG DataGrid dans Style ou ressource

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

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

La raison en est que je dois partager la définition de colonne pour 4 différents DataGrids. Un moyen d'y parvenir? Le mieux serait sans code derrière!

+1

Je suppose que cela dépend du fournisseur de Datagrid ... Je sais que Xceed DataGrid permet de définir des colonnes dans les ressources, mais je ne sais pas pour les autres. Lequel utilisez-vous ? La boîte à outils WPF un? – Bruno

+0

J'utilise le DataGrid .NET 4 WPF – SACO

Répondre

20

Colonnes propriété du DataGrid n'a pas setter il est donc pas possible. Vous pouvez cependant faire quelque chose comme ceci:

<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

Ok, cela semble faire l'affaire. Mais comment puis-je appliquer un style au contenu d'un contentcontrol (donc en réalité au DataGrid)? – SACO

+0

S'il vous plaît poster une nouvelle question, difficile de répondre dans les commentaires. –

+0

http://stackoverflow.com/questions/5731276/wpf-contentcontrol-styling – SACO

4

Je ne pense pas que vous pouvez, car dans cette situation, vous ne spécifiez pas un modèle ou un style, mais l'objet Column réel. Je ne pense pas que les grilles de données jouent bien quand on partage comme ça; Je pense que vous obtiendrez une exception dans la mesure où "cette UIElement est déjà l'enfant d'un autre UIElement".

J'ai donc essayé ce qui suit ... légèrement différent de ce dont vous parlez. mais je suis arrivé cette exception:

{ « DataGridColumn avec en-tête « » existe déjà dans la collection Colonnes d'un DataGrid DataGrid ne peuvent pas partager des colonnes et ne peuvent pas contenir des instances de colonne en double \ r \ nParameter nom:.. article »}

avec ce 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

Nous vous remercions de l'avoir posté, même s'il ne répond pas à la question. L'inclusion du texte d'exception m'a aidé à trouver la réponse dont j'avais besoin (x: Shared = "False"). – Malachi

24

x: Partagé aide à éviter l'exception que MattS423 a.

<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

Cela a été une excellente solution pour moi d'éviter de copier et coller les mêmes définitions de colonnes encore et encore. Je trouve étrange que x: Shared n'apparaisse pas dans l'intellisense, mais fonctionne tout de même – wangburger

+0

jamais plus sur Shared on resources ... résout plusieurs problèmes pour moi y compris la réutilisation des colonnes dataagrid pour plusieurs dataagrids, merci beaucoup – TCC

Questions connexes