2010-08-10 2 views
9

J'ai une grille de données avec des colonnes définies, puis un modèle de détails de ligne. Comment puis-je accéder à un contrôle dans le modèle de détails de ligne dans le code derrière? J'ai un bouton que je veux activer/désactiver par programmation, mais je n'arrive pas à comprendre comment y accéder dans le code. Je l'ai vu sur le MSDN:Comment accéder par programme à un contrôle de détails de lignes de données de données

http://msdn.microsoft.com/en-us/library/bb613579.aspx

mais qui vient décrire un modèle de données régulières, donc quand j'ai essayé que cela ne fonctionne pas. Mon cas est un modèle de données de détail de ligne. Il est certain que quelqu'un a écrit du code pour accéder à un contrôle dans un gabarit de détails de la ligne de données qui peut commenter (cela serait très apprécié).

Répondre

7

D'accord, je me suis dit comment obtenir ce travail, je devais modifier le code qui est écrit dans cet article MSDN dans la question originale ....

DataGridRow row = (DataGridRow)(KeywordsGrid.ItemContainerGenerator.ContainerFromItem(KeywordsGrid.SelectedItem)); 

// Getting the ContentPresenter of the row details 
DataGridDetailsPresenter presenter = FindVisualChild<DataGridDetailsPresenter>(row); 

// Finding Remove button from the DataTemplate that is set on that ContentPresenter 
DataTemplate template = presenter.ContentTemplate; 
Button button = (Button)template.FindName("RemoveItemButton", presenter); 

« KeywordsGrid » est la variable liée à mon DataGrid. Remarquez que dans mon appel à FindVisualChild, j'utilise une classe "DataGridDetailsPresenter" au lieu d'une "ContentPresenter" (c'était la clé ... cela a forcé la méthode FindVisualChild à parcourir tout le contenu de tous les contentpresenters jusqu'à ce que j'arrive à l'un pour les détails de la rangée).

1

Pouvez-vous définir (ou existe-t-il déjà) une propriété sur le type d'objet affiché dans la grille qui représente l'état activé du bouton? Si oui, il serait beaucoup plus simple de modifier le modèle de détail de ligne pour lier la propriété IsEnabled du bouton à cette propriété.

+0

Oui, dans mon modèle de vue, je pourrais avoir une propriété dans la classe utilisée pour la grille de données. Donc, c'est une façon de le faire. Et j'ai juste compris comment le faire dans le code derrière la classe aussi. Je posterai cela comme une réponse séparée. Merci pour votre réponse! – BrianP

1

Utilisez l'événement DataGrid.LoadingRowDetails! C'est beaucoup plus simple.

Je trouve cela ici: How to change Text of TextBlock which is in DataTemplate of Row Details for each DataGrid Row Details?

Exemple:

XAML

<DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <TextBlock x:Name="Test">Test</TextBlock> 
     </DataTemplate> 
</DataGrid.RowDetailsTemplate> 

C#

private void dgVehicles_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
{ 
    TextBlock tbTest = e.DetailsElement.FindName("Test") as TextBlock; 
    if (tbTest != null) 
    { 
     tbTest.Text = "Juhuu"; 
    } 
} 
Questions connexes