2010-08-10 21 views
9

Mam datagrid z niektórymi zdefiniowanymi kolumnami, a następnie szablon szczegółów wiersza. Jak uzyskać dostęp do kontroli w szablonie szczegółów wiersza w kodzie? Mam przycisk, który chcę programowo włączyć/wyłączyć, ale nie mogę się dowiedzieć, jak uzyskać do niego dostęp w kodzie. Widziałem to na MSDN:Jak programowo uzyskać dostęp do szczegółów szczegółów wiersza danych datagrid

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

ale to tylko opisując regularny szablon danych, więc kiedy próbowałem to, że nie działa. Mój przypadek to szablon danych szczegółowych wierszy. Z pewnością ktoś napisał kod, aby uzyskać dostęp do kontroli w szablonie szczegółów wiersza datagrid, który może komentować to (byłby bardzo doceniany).

Odpowiedz

7

Dobra, zorientowali się, jak uzyskać tej pracy miałem do dostrojenia kod jest zamieszczonych w tym artykule MSDN w oryginalnym pytanie ....

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” to zmienna związana z mój datagrid. Zawiadomienie w moim wołaniu do FindVisualChild, używam klasy "DataGridDetailsPresenter" zamiast "ContentPresenter" (To był klucz ... To zmusiło metodę FindVisualChild do iteracji przez wszystkie treści contenternalistów, aż dotarłem do jednego dla szczegółów wiersza).

1

Czy można zdefiniować (lub istnieje już) właściwość na typie obiektu wyświetlanego w siatce, który reprezentuje włączony stan przycisku? Jeśli tak, znacznie łatwiej byłoby zmodyfikować szablon szczegółów wiersza, aby powiązać właściwość IsEnabled przycisku z tą właściwością.

+0

Tak, w moim modelu widoku, mogę mieć właściwości w klasa używana dla datagridu. Jest to jeden sposób na zrobienie tego. Po prostu wymyśliłem, jak to zrobić w kodzie za klasą. Opublikuję to jako osobną odpowiedź. Dzięki za twoją odpowiedź! – BrianP

1

Użyj zdarzenia DataGrid.LoadingRowDetails! To jest o wiele bardziej proste.

Znalazłem to tutaj: How to change Text of TextBlock which is in DataTemplate of Row Details for each DataGrid Row Details?

Przykład:

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"; 
    } 
} 
Powiązane problemy