Question

J'ai une grille de données à laquelle je lie une données. Je ne sais pas quelles lignes ou colonnes seront dans le tableau de données, donc j'ai défini la propriété AutoGeenerateColumns de la grille de données TRUE. La seule chose que je sais avec certitude, c'est que chaque cellule de la table de données sera de champ de type et que la classe de terrain a une propriété ENUM appelée type.

<DataGrid
    x:Name="dg"
    AutoGenerateColumns="True"
    ItemsSource="{Binding Path=Fields}"
    AutoGeneratingColumn="dg_AutoGeneratingColumn">
</DataGrid>

Ce que je veux faire, c'est de forcer toutes les colonnes générées automatiquement pour être DatatemplateColumns qui ont la propriété CellTemplateSelector définie sur un objet FieldCellTemaplateElector. Pour ce faire, j'ajoute le code suivant l'événement AutoGeeneratingColumn:

private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    //cancel the auto generated column
    e.Cancel = true;

    //create a new template column with the CellTemplateSelector property set
    DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
    dgtc.CellTemplateSelector = new FieldCellTemplateSelector();
    dgtc.IsReadOnly = true;
    dgtc.Header = e.Column.Header;

    //add column to data grid
    DataGrid dg = sender as DataGrid;
    dg.Columns.Add(dgtc);
}

Le code de la classe FieldCellTemplateSelector est le suivant:

public class FieldCellTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        return base.SelectTemplate(item, container);
    }
}

Dans la méthode SelectTemplate, j'ai besoin d'obtenir l'objet de champ contenu dans la cellule et de renvoyer le modèle de données pertinent en fonction de la propriété Type de ce champ. Le problème est que le paramètre de l'élément qui est passé n'est pas du champ de type, il est de type datarowView.

Je peux obtenir l'objet DataGridCell en faisant ce qui suit:

ContentPresenter presenter = container as ContentPresenter;
DataGridCell cell = presenter.Parent as DataGridCell;

Cependant, le contexte de données de la cellule est également de type datarowView. Qu'est-il arrivé à mon domaine? A-t-il disparu? Quelqu'un peut-il me faire savoir comment y arriver ou comment réaliser une solution à ce problème

Merci d'avance.

Était-ce utile?

La solution

J'ai eu le même problème. J'ai trouvé la réponse à ce lien.

http://social.msdn.microsoft.com/forums/en/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top