Итак, в основном у меня есть список заданий, которые я отслеживаю в Datagrid. В этом datagrid у меня есть кнопка, я хочу быть кнопкой «Отмена», когда работа выполняется, но в остальном - кнопка «Повторить».WPF datagrid: поиск элемента управления при добавлении строки
Итак, я добавил кнопку на моей сетке:
<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>
И в коде, я добавить свой объект в ObservableCollection, чтобы добавить его к сетке:
_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";
С GetGridButton существо:
private Button GetGridButton(string name, Job job)
{
var selectedRow = (DataGridRow)JobDataGrid.ItemContainerGenerator.ContainerFromItem(job);
return ExtensionMethods.FindVisualChildren<Button>(selectedRow).First(x => x.Name == name);
}
Я подтвердил, что GetGridButton УНР ks с уже существующими строками. Проблема в том, что когда вы добавляете новую строку в базовый набор данных и называете это, она не может найти DataGridRow. Я предполагаю, что это происходит потому, что он еще не создан. Так, просматривая события, казалось, что событие LoadingRow будет хорошим кандидатом:
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";
}
}
Итак, теперь есть DataGridRow объект перейти в FindVisualChildren, но он по-прежнему Безразлично» t найдите любые кнопки. Итак, есть ли способ получить доступ к этой кнопке в добавленной строке?
MVVM - ваш друг. –
Не очень полезно. – jbirzer