2012-03-22 5 views
0

Je souhaite que mes colonnes DataGrid partagent un gabarit cell/celledit. J'ai la solution faire cela (merci à WPF DataGridTemplateColumn shared template?). Maintenant, ce que j'aimerais, c'est améliorer la lisibilité en évitant tous les nids de nœuds.wpftoolkit DataGridTemplateColumn Modèle de liaison

Mon opinion actuelle ressemble à ce que:

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False"> 

    <wpftk:DataGrid.Resources> 
     <DataTemplate x:Key="CustomCellTemplate"> 
     <TextBlock Text="{TemplateBinding Content}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="CustomCellEditingTemplate"> 
     <TextBox Text="{TemplateBinding Content}"></TextBox> 
     </DataTemplate> 
    </wpftk:DataGrid.Resources> 

    <wpftk:DataGrid.Columns> 

     <wpftk:DataGridTemplateColumn Header="Start Date"> 
     <wpftk:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
      <ContentPresenter ContentTemplate="{StaticResource CustomCellTemplate}" Content="{Binding StartDate}"/> 
      </DataTemplate> 
     </wpftk:DataGridTemplateColumn.CellTemplate> 
     <wpftk:DataGridTemplateColumn.CellEditingTemplate> 
      <DataTemplate> 
      <ContentPresenter ContentTemplate="{StaticResource CustomCellEditingTemplate}" Content="{Binding StartDate}"/> 
      </DataTemplate> 
     </wpftk:DataGridTemplateColumn.CellEditingTemplate> 
     </wpftk:DataGridTemplateColumn> 

     <!--and again the whole block above for each columns...--> 

    </wpftk:DataGrid.Columns> 
    </wpftk:DataGrid> 

Ce que je voudrais obtenir est de lier la valeur au niveau DataGridTemplateColumn et se propager au niveau du modèle. Quelqu'un sait comment faire cela?

Ce que j'ai essayé de faire est quelque chose comme ça:

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False"> 

    <wpftk:DataGrid.Resources> 
     <DataTemplate x:Key="CustomCellTemplate"> 
     <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="CustomCellEditingTemplate"> 
     <TextBox Text="{Binding}"></TextBox> 
     </DataTemplate> 
    </wpftk:DataGrid.Resources> 

    <wpftk:DataGrid.Columns> 
     <wpftk:DataGridTemplateColumn Header="Start Date" Binding="{Binding StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
     <wpftk:DataGridTemplateColumn Header="End Date" Binding="{Binding EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
    </wpftk:DataGrid.Columns> 
    </wpftk:DataGrid> 

Il est évident que létablissement de liaison n'est pas une propriété valide de la DataGridTemplateColumn mais peut-être en jouant avec le datacontext et une source relative pourrait faire l'affaire, mais franchement Je ne peux pas trouver un moyen de mettre en œuvre cela. Je ne sais pas si ce que je veux est possible et je suis prêt à accepter une « aucune façon, vous pouvez le faire » comme une réponse

NOTE

: Le TextBlock/TextBox dans le modèle est juste pour le test (le modèle réel est beaucoup plus complexe) DataGridTextColumn ne fera pas l'affaire Merci à l'avance

Répondre

1

Qu'est-ce que vous avez essayé aurait travaillé comme vous réduit la XAML en spécifiant le DataTemplates en utilisant la syntaxe de la propriété.

Editer: Désolé. J'ai mal interprété votre question. Pour ajouter une propriété pouvant être liée à DataGridTemplateColumn sans modifier ou accéder au code source, vous pouvez créer un AttachedProperty.

Exemple:

public class DataBindingHelper 
{ 

    #region AttachedBinding 

    public static readonly DependencyProperty AttachedBindingProperty = DependencyProperty.RegisterAttached("AttachedBinding", typeof(Binding), typeof(DataBindingHelper), new FrameworkPropertyMetadata(null)); 

    public static Binding GetUseAncestorDataContext(DependencyObject d) 
    { 
     return (bool)d.GetValue(AttachedBindingProperty); 
    } 

    public static void SetUseAncestorDataContext(DependencyObject d, Binding value) 
    { 
     d.SetValue(AttachedBindingProperty, value); 
    } 

    #endregion 

} 

Utilisation:

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False"> 

    <wpftk:DataGrid.Resources> 
     <DataTemplate x:Key="NameTemplate"> 
      <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="EditingTemplate"> 
      <TextBox Text="{Binding}"/> 
     </DataTemplate> 

     <DataTemplate x:Key="CustomCellTemplate"> 
      <ContentPresenter ContentTemplate="{StaticResource NameTemplate}" 
           Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" /> 
     </DataTemplate> 
     <DataTemplate x:Key="CustomCellEditingTemplate"> 
      <ContentPresenter ContentTemplate="{StaticResource EditingTemplate}" 
           Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" />        
     </DataTemplate> 

    </wpftk:DataGrid.Resources> 

    <wpftk:DataGrid.Columns> 
     <wpftk:DataGridTemplateColumn Header="Start Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
     <wpftk:DataGridTemplateColumn Header="End Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/> 
    </wpftk:DataGrid.Columns> 

</wpftk:DataGrid> 

Pour en savoir plus sur les propriétés ci-joints: lire le MSDN documentation ou tout WPF/C# livre. Ils sont l'une des choses les plus puissantes sur le système de liaison de données dans WPF.


Aussi, si vous voulez en savoir plus sur le débogage et itérer une application WPF lire mon answer récente sur le sujet. Snoop en particulier aurait été utile pour vous de comprendre ce qui n'allait pas avec ce qui précède.

+0

Je ne suis pas sûr que je vous suis, mon problème est que je ne sais pas comment lier les données réelles directement à partir de DataGridTemplateColumn, Liaison n'est pas une propriété de DataGridTemplateColumn. Je peux lier le modèle d'édition et le modèle normal mais je ne sais pas comment lier les données au modèle. mon estimation est de mettre le DataContext du modèle avec les données que je veux mais je ne sais pas comment faire cela – Guillaume

+0

Edited answer pour mieux répondre à votre question initiale. – Dennis

+0

Génial! que je cherchais – Guillaume

Questions connexes