So, basically I have a list of jobs that I'm keeping track of in a Datagrid. In that datagrid, I have a button I want to be a "Cancel" button when the job is running, but otherwise be a "Retry" button.
So, I've added the button to my grid:
<DataGridTemplateColumn x:Name="JobActionColumn" Header="">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button Click="JobActionButton_Click" Content="Resend" Name="JobActionButton" Height="18" Width="45" Margin="0,0,0,0" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
And in the code, I add my object in an ObservableCollection to add it to the grid:
_jobs.Add(job);
CollectionViewSource jobViewSource = this.FindViewSource("JobViewSource");
jobViewSource.View.Refresh(); // Ensure that the new job appears at the top of the grid.
JobDataGrid.SelectedItem = job;
// Note: The Controller.Completed event handler disposes the controller object.
Controller controller = new Controller(_historyContext);
_controllers.Add(controller);
controller.Completed += Controller_Completed;
controller.Process(job);
GetGridButton("JobActionButton", job).Content = "Cancel";
With GetGridButton being:
private Button GetGridButton(string name, Job job)
{
var selectedRow = (DataGridRow)JobDataGrid.ItemContainerGenerator.ContainerFromItem(job);
return ExtensionMethods.FindVisualChildren<Button>(selectedRow).First(x => x.Name == name);
}
I've confirmed that GetGridButton works with rows that already exist. The problem is that when you add a new row to the underlying dataset and call this, it can't find the DataGridRow. I assume this is because it hasn't been created yet. So, looking through events, it looked like that the LoadingRow event would be a good candidate:
private void JobDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
Job job = (Job)e.Row.Item;
if (_controllers.FirstOrDefault(x => x.Job == job) != null)
{
var y = ExtensionMethods.FindVisualChildren<Button>(e.Row);
Button button = ExtensionMethods.FindVisualChildren<Button>(e.Row).First(x => x.Name == "JobActionButton");
button.Content = "Cancel";
}
}
So, now there is a DataGridRow object to pass into FindVisualChildren, but it still doesn't find any buttons. So, is there any way for me to access this button on an added row?