Как мгновенно отправить дочерние данные родителю в немодальном окне приложения WPF - PullRequest
1 голос
/ 11 июня 2019

Использование VS2019 - приложение WPF: Моя цель - обновить приложение родительского окна ListBox в реальном времени, отредактировав немодальное дочернее окно TextBox, возможно ли это?

Представьте себе приложение, в котором есть список пользователей, для которогоВы можете добавлять, удалять, редактировать и просматривать.Add и Edit работают одним модальным окном с разными методами.Представление должно быть немодальным окном (поэтому я создал другой класс), и оно должно выполнять оперативное обновление пользовательских данных в ListBox.

MainWindow.cs:

public UserDlg userDlg; //modal window (it has OK/cancel buttons)
public UserView userView; //modeless window (it has only Close button)
public List<User> users = new List<User>(); // a distinct user class that also has a method .getUser() that prints user data to String.

private void View(object sender, RoutedEventArgs e) { //view button
        userView.Show();
        userView.openEdition(users[sel].fName, users[sel].lName, users[sel].eMail);// it passes ListBox selected user data to new window (works)
        }

private void UsersList_SelectionChanged(object sender, SelectionChangedEventArgs e){ //ListBox changes here

        ...if (userView != null && userView.IsVisible)
            {
                userView.openEdition(users[sel].fName, users[sel].lName, users[sel].eMail); // this updates selection in modeless window (works)
            }

UserView.cs:

public void FName1_TextChanged(object sender, TextChangedEventArgs e)
        {
            Console.WriteLine(fName1.Text + " / " + lName1.Text + " / " + eMail1.Text); //this part is to show me that every character written/removed works fine
            user.setUserData(getFirstName(), getLastName(), getMailAddress());
            string dataToPass = user.getUser(); // - here I tried with RoutedEventHandler (something I found on web) but I managed to only send preinitialized string with a button - not a real-time text changed from textbox
        }
public void openEdition(string fName, string lName, string eMail)
        {
            user = new User(fName, lName, eMail);
            fName1.Text = fName;
            lName1.Text = lName;
            eMail1.Text = eMail;
        }

Я ожидаю изменить данные в родительском режиме в реальном времени, изменив текстовое поле в немодальном дочернем элементе ... какие-либо идеи?

РЕДАКТИРОВАТЬ: Я использовал (некоторые ошибочные) знания из Java, я думаю.Я думал о создании UserView с окном MainWindow в качестве параметра .. как родитель, это сработало, и я верю, что каким-то образом удалось решить мою проблему?- Тестирование прямо сейчас (я вернусь через 10-15 минут, я надеюсь.) >> UserView.cs:

MainWindow window;
public UserView(MainWindow window){ this.window = window; ... }

Теперь я могу просто вызвать window.usersList.Items.Add ("Test").);например.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Хорошо, использовал то решение, которое я нашел - протестировал, и оно работает просто "достаточно хорошо". Что я сделал : MainWindow.cs:

private void View(object sender, RoutedEventArgs e)
        {
            userView = new UserView(this);
            userView.Show();
            userView.openEdition(users[sel].fName, users[sel].lName, users[sel].eMail);
        }

UserView.cs:

public UserView(MainWindow window)
        {
            this.window = window;
            InitializeComponent();
        }
public void FName1_TextChanged(object sender, TextChangedEventArgs e)
        {
            wasEdited = true;
            user.setUserData(getFirstName(), getLastName(), getMailAddress());
            string dataToPass = user.getUser();
        }
private void Close(object sender, RoutedEventArgs e) // Close button
        {
            closeEdition();
            Close();
        }
public void closeEdition()
        {
            if (wasEdited)
            {
                window.users[window.sel].fName = user.fName;
                window.users[window.sel].lName = user.lName;
                window.users[window.sel].eMail = user.eMail;
                window.usersList.Items.Insert(window.usersList.SelectedIndex, user.getUser());
                window.usersList.Items.Remove(window.usersList.SelectedItem);
            }
            window.usersList.Items.Refresh();
        }

Если в текстовом поле был изменен текст, логическое значение wasEdited равно true.

0 голосов
/ 11 июня 2019

Если вы хотите создать приложение в WPF с «передовой практикой», вам нужно прочитать о MVVM в WPF.

Но в этой ситуации вам нужно знать о (DataContext, ItemsSource), потому что в WPFданные в большинстве случаев перемещаются с помощью привязки и ViewModels.

1 метод .- использовать привязку к общему ViewModel.

enter image description here

UPDATE

Если ваша привязка ViewParent к полю в ViewModel и привязка ViewChild к ViewModel, чемесли вы измените данные в ViewParent, то данные изменится во ViewModel, и данные из ViewChild тоже изменятся (потому что это привязка к ViewModel)

2 метод

Привязать к другомуПосмотреть.Его привязка, как указано выше, но вы создаете привязку к View и поле в View.

Ключевые слова: привязка, привязка данных, mvvm, INPC.

Хорошие ссылки.Я думаю, что это поможет вам MVVM: учебное пособие от начала до конца?

РЕДАКТИРОВАНИЕ (ОБНОВЛЕНИЕ): неправильная позиция на wpf.Если вы не будете использовать связывание, вы преобразуете wpf в winforms и закроете для себя 90% возможностей WPF.

Для этого вы можете использовать WinForms, это проще, чем wpf, и иметь такие функции, как то, что вы пытаетесь сделать (отправитьссылка на родительский вид и т. д.)

...