Как реализовать переход по окнам с входными данными через метод wpf
появилась идея, что можно реализовать проверку на то, выбрал ли пользователь кого-то из таблицы для редактирования или удаления с помощью метода, но столкнулся с такой проблемой, что окно, которое должно открываться для редактирования элемента, требует объект из таблицы, и если объект == null, то это окно будет с пустыми TextBox, если != null, то в окне все TextBox будут с информацией об объекте. Проблема состоит в том, что пытаясь создать универсальный метод, который подходил для любого окна я смог указать, что Window может быть с входными параметрами. Прилагаю код:
public static void IsNull<T>(Window window, DataGrid dataGrid)
{
if (dataGrid.SelectedItem is T obj)
{
window(obj).ShowDialog(); //должно быть что-то в этом роде,
//но тут ошибка "Method, delegate, or event is expected"
}
else
{
MessageBox.Show(
"Выберите для редактирования объект из таблицы",
"Редактирование",
MessageBoxButton.OK,
MessageBoxImage.Warning);
}
}
Вот пример того, как должно работать
private void EditTeacherBtn_OnClick(object sender, RoutedEventArgs e)
{
if (TeachersDataGrid.SelectedItem is Teacher teacher)
{
new AddEditTeacherWindow(teacher).ShowDialog();
}
else
{
MessageBox.Show(
"Выберите учителя для редактирования",
"Изменение учителя",
MessageBoxButton.OK,
MessageBoxImage.Warning);
}
}
Буду очень благодарен если подскажите иные способы решения этой идеи
Ответы (2 шт):
Можно создать через активатор, но честно говоря так никто не делает. С WPF давно не работал, но кажется вам нужно посмотреть в сторону MVVM,а этот код только в экспериментальных целях
public static void OpenWindowIfItemNotNull<TItem, TWindow>(TItem item)
where TWindow : Window, new()
{
if (item is not null)
{
var window = (TWindow)Activator.CreateInstance(typeof(TWindow), item);
window.ShowDialog();
}
}
Всем огромное спасибо за ответы и комментарии. Я нашел решение моего вопроса, для интересующихся оно выглядит так:
public delegate void ShowEditWindowDelegate<in T>(T obj);
public static void IsNull<T>(ShowEditWindowDelegate<T> showEditWindowDelegate, DataGrid dataGrid)
{
if (dataGrid.SelectedItem is T obj)
{
showEditWindowDelegate(obj);
}
else
{
MessageBox.Show(
"Выберите для редактирования объект из таблицы",
"Редактирование",
MessageBoxButton.OK,
MessageBoxImage.Warning);
}
}
Я создал делегат ShowEditWindowDelegate<T>
для вызова метода открытия окна с объектом типа T
, и после этого я использую делегат в своем методе вместо передачи окна напрямую в него. После я вызываю этот метод в обработке нажатия:
private void EditTeacherBtn_OnClick(object sender, RoutedEventArgs e)
{
Helpers.IsNullChecker.IsNull<Teacher>((teacher) =>
{
new AddEditTeacherWindow(teacher).ShowDialog();
}, TeachersDataGrid);
}