2010-07-30 23 views
4

Cela me rend fou. Je crée un DataGrid dans du code, puis je le lie à un datatable. C'est dynamique et les lignes et les colonnes seront différentes chaque fois que la grille est créée.WPF DataGrid Liaison à datable

En fait, je boucle à travers mes DataTable et créer des colonnes DataGrid pour chaque colonne, comme ceci:

private static void CreateDataGridColumns(DataGrid datagrid, Document doc) 
{ 
    if (doc == null) return; //return 

    datagrid.Columns.Clear(); 
    foreach (var item in doc.Keys) 
    { 
     var column = new DataGridTemplateColumn 
     { 
      Header = item, 
      CellTemplateSelector = new CustomRowDataTemplateSelector(), 
     }; 

     datagrid.Columns.Add(column); 
    } 
} 

Comme vous pouvez le voir, je me sers d'un sélecteur de modèle de données personnalisées afin que je puisse rendre la cellule différemment en fonction sur son contenu.

Voici le sélecteur de modèle

public class CustomRowDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate 
     SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     var presenter = container as ContentPresenter; 
     var gridCell = presenter.Parent as DataGridCell; 

     if (element != null && item != null && gridCell != null) 
     { 
      var row = item as DataRow; 

      if (row != null) 
      { 
       var cellObject = row[gridCell.Column.DisplayIndex]; 

       //set template based on cell type 

       if (cellObject is DateTime) 
       { 
        return element.FindResource("dateCell") as DataTemplate; 
       } 

       return element.FindResource("stringCell") as DataTemplate; 
      } 


     } 

     return null; 
    } 
} 

Voici mon stringCell DataTemplate

<DataTemplate x:Key="stringCell"> 
    <StackPanel> 
     <TextBlock Style="{StaticResource cellStyle}" 
        Grid.Row="0" Grid.Column="0" 
        Text="{Binding Converter={StaticResource cellConverter}}" /> 
    </StackPanel> 
</DataTemplate> 

Le problème est que le sélecteur de modèle est appelé pour chaque cellule (comme prévu), mais je ne peux pas dire quelle cellule il est, donc je ne sais pas comment définir le texte sur le TextBlock. J'aimerais faire quelque chose comme ceci

<DataTemplate x:Key="stringCell"> 
    <StackPanel> 
     <TextBlock Style="{StaticResource cellStyle}" 
        Grid.Row="0" Grid.Column="0" 
        Text="{Binding Path=Row[CellIndex], Converter={StaticResource cellConverter}}" /> 
    </StackPanel> 
</DataTemplate> 

Mais il n'y a rien disponible pour moi pour obtenir CellIndex. Comment puis-je faire quelque chose de similaire à cela où je peux définir le chemin = Row [CellIndex]

Répondre

-1

Vous ne savez pas ce que vous essayez de réaliser fonctionnellement. Vous pourriez partir avec le faire dans le code. Créez une classe de niveau supérieur, CellClass, qui a une propriété DisplayValue. Avec implémentation pour la date et la chaîne. Liez la source à CellClass avec Path = DisplayValue. Vous pouvez même créer List CellClasses et Bind to CellClass [0], CellClass [1] ... En savoir que cela fonctionne comme je le fais mais je ne sais pas si elle fournit la fonctionnalité que vous recherchez.

public abstract class CellClass 
    { 
     public abstract String DispValue { get; } 
    } 
    public class CellClassDate : CellClass 
    { 
     public override String DispValue { get ...; } 
     public DateTime DateValue { get .. set ... } 
    } 
    public class CellClassString : CellClass 
    { 
     public override String DispValue { get ...; } 
     public DateTime StringValue { get .. set ... } 
    } 
0

Vous pouvez essayer de créer une liaison dans le code. Quelque chose comme ça devrait fonctionner

var bind = new Binding(gridCell.Column.Header.ToString()) 
bind.Mode = BindingMode.TwoWay; 
bind.Source = row; 
BindingOperations.SetBinding(YourTextBlock, TextBlock.TextProperty, bind);