2010-11-23 6 views
1


J'ai plusieurs DataGrid dans mon application et ils ont chacun le même "modèle". Par exemple, voici comment chaque DataGrid est définie:DataGrid et DataGridTemplateColumn

<DataGrid Style="{StaticResource MainGridStyle}"> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn CanUserResize="False" 
     CanUserSort="False" 
      CanUserReorder="False" 
      CellStyle="{StaticResource RightCellStyle}"> 
... 

Comment pourrais-je définir le « DataGridTemplateColumn » comme un modèle dans un fichier de ressource externe, donc je devrais simplement écrire quelque chose comme

<DataGridTemplateColumn Style={StaticResource MyFirstColumn}/> 

Dans le "MainGridStyle" je définis des propriétés telles que "CanUserAddRows", ...

Merci d'avance pour votre aide.
Fred

Répondre

1

Depuis DataGridTemplateColumn ne dispose pas d'une propriété Style, une chose que vous pouvez faire est de créer une propriété attachée

Voici un exemple:.

[REMARQUE: Vous Vous devrez peut-être modifier le code suivant en fonction de votre projet.]

Classe avec une propriété jointe -

public class StyleExtensions 
{ 
    public static Style GetStyle(DependencyObject obj) 
    { 
     return (Style)obj.GetValue(StyleProperty); 
    } 

    public static void SetStyle(DependencyObject obj, Style value) 
    { 
     obj.SetValue(StyleProperty, value); 
    } 

    public static void StyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Style style = e.NewValue as Style; 
     if (style != null) 
     { 
      foreach (var s in style.Setters.OfType<Setter>()) 
      { 
       d.SetValue(s.Property, s.Value); 
      } 
     } 
    } 

    // Using a DependencyProperty as the backing store for Style. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty StyleProperty = 
     DependencyProperty.RegisterAttached("Style", typeof(Style), typeof(StyleExtensions), new UIPropertyMetadata(StyleChanged)); 
} 

Définition des Style -

<Style x:Key="MyFirstColumn"> 
     <Setter Property="DataGridColumn.CanUserResize" 
       Value="False" /> 
     <Setter Property="DataGridColumn.CanUserSort" 
       Value="False" /> 
     <Setter Property="DataGridColumn.CanUserReorder" 
       Value="False" /> 
     <Setter Property="DataGridColumn.CellStyle" 
       Value="{StaticResource RightCellStyle}" /> 
    </Style> 

utilisation -

  <DataGrid> 
       <DataGrid.Columns> 
        <DataGridTemplateColumn local:StyleExtensions.Style="{StaticResource MyFirstColumn}"></DataGridTemplateColumn> 
       </DataGrid.Columns> 
      </DataGrid> 
4

Vous parlez de 4 choses différentes ici:

  • le style de dataGrid
  • modèle de la DataGrid
  • style de votre première colonne
  • modèle de votre première colonne

alors soyons précis d'abord: en choisir un et s'y tenir, essayez de ne pas mélanger le style et le modèle (on peut contenir l'autre de toute façon)

maintenant, d'après ce que je comprends, vous êtes plus intéressé à faire un modèle pour votre première colonne que pour l'ensemble grille de données.

Il devrait être assez facile:

1) Tout d'abord, déclarer votre modèle de colonne (ou style) dans un dictionnaire de ressources (de préférence dans les ressources de votre application):

<Application.Resources> 
    <Template TargetType="DataGridTemplateColumn" x:Key="MyFirstColumnTemplate "> 
    ... 
    </Template> 
</Application.Resources> 

2) puis, tout simplement l'appeler comme vous vouliez faire:

<DataGrid Style="{StaticResource MainGridStyle}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Template="{StaticResource MyFirstColumnTemplate}"/> 
     ... 
    </DataGrid.Columns> 
<DataGrid> 

EDIT:

dans le cas d'un DataGridTemplateColumn, comme vous avez seulement les propriétés CellTemplate et CellEditingTemplate disponibles, vous pouvez le faire comme suit:

<Application.Resources> 
    <DataTemplate x:Key="CellTemplate"> 
    ... 
    </DataTemplate> 
    <DataTemplate x:Key="CellEdintingTemplate"> 
    ... 
    </DataTemplate> 
</Application.Resources> 

<DataGrid Style="{StaticResource MainGridStyle}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellTemplate="{StaticResource MyFirstColumnCellTemplate}" CellEdintingTemplate="{StaticResource MyFirstColumnCellEdintingTemplate}"/> 
     ... 
    </DataGrid.Columns> 
<DataGrid> 

Avertissement: Je ne suis pas sûr que ce soit un ControlTemplate ou un datatemplate pour la cellule (édition) modèle, essayez les deux et voir Wich un correspond à

+0

Eh bien, ce semble tout à fait banal. Et si je veux déclarer ce "Modèle" dans un fichier de ressources/dictionnaire externe? En passant, mon VisualStudio se plaint qu'il n'y a pas de propriété Template dans DataGridTemplateColumn! – Fred

+0

En effet, pour un DataGridTempalteColumn, vous n'avez que les propriétés CellTemplate et CellEditingTemplate disponibles. jetez un oeil là: http://msdn.microsoft.com/fr-fr/library/system.windows.controls.datagridtemplatecolumn_properties%28v=VS.95%29.aspx – David

+0

Pour le CellTemplate, c'était clair pour moi. Mais pour DataGridTemplateColumn, c'est autre chose. Donc, en fait, il semble impossible de définir un "modèle de colonne réutilisable personnalisé"?!?! Étrange! – Fred

0

Pour le fichier de ressources « externe », vous pouvez simplement le mettre dans un dictionnaire de ressources que vous appelez en vous app.xaml fichier:

dans votre Fichier "customTemplates.xaml":

<ResourceDictionary> 
... 
</ResourceDictionary> 

et puis dans vous "app.XAML » file:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="customTemplates.xaml" /> 
      ... 
      //add other resource dictionaries here if any 
      ... 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
Questions connexes