Как реализовать переход по окнам с входными данными через метод 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 шт):

Автор решения: pasha goroshko

Можно создать через активатор, но честно говоря так никто не делает. С 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();
        }
    }
→ Ссылка
Автор решения: Vorahaz

Всем огромное спасибо за ответы и комментарии. Я нашел решение моего вопроса, для интересующихся оно выглядит так:

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);
    }
→ Ссылка