How to programmatically access a datagrid row details control

BrianP picture BrianP · Aug 10, 2010 · Viewed 17.5k times · Source

I've got a datagrid with some defined columns and then a row details template. How do I access a control in the row details template within the code behind? I've got a button that I want to programmatically enable/disable, but I can't figure out how to get access to it in the code behind. I've seen this on the MSDN:

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

but that's just describing a regular data template, so when I tried that it didn't work. My case is a row details data template. Surely someone has written code to access a control within a datagrid row details template that can comment on this (Would be much appreciated).

Answer

BrianP picture BrianP · Aug 10, 2010

Okay, I figured out how to get this working I had to tweak the code that is posted in that MSDN article in the original question ....

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 is the variable tied to my DataGrid. Notice in my call to FindVisualChild, I'm using a DataGridDetailsPresenter class instead of a ContentPresenter (this was the key... it forced the FindVisualChild method to iterate all the way through all the content presenters until I got to the one for the row details).