Как ссылаться на текстовые поля из нескольких окон в приложении WPF? - PullRequest
0 голосов
/ 18 января 2019

Я создаю приложение для создания заметок с несколькими окнами для сбора информации. Как сохранить значения нескольких текстовых полей в нескольких окнах в переменных при нажатии кнопки?

Я успешно реализовал это в MainWindow, и у меня возникли проблемы с расширением парадигмы для нескольких окон. У меня такое ощущение, что это связано с не назначением имени экземпляру второго окна, но я не уверен, как это работает.

Это код функции, которая работает в MainWindow:

public static void CopyText()
        {
            string srText = ((MainWindow)Application.Current.MainWindow).srBox.Text;
            string contactText = ((MainWindow)Application.Current.MainWindow).contactBox.Text;
            string usernameText = ((MainWindow)Application.Current.MainWindow).usernameBox.Text;
            string generalText = ((MainWindow)Application.Current.MainWindow).generalBox.Text;

            string copyText = "";

            Clipboard.SetDataObject(copyText);
        }

Это код функции в CreditWindow, которая не работает:

public static void CopyCreditText()
        {
            string srText = ((MainWindow)Application.Current.MainWindow).srBox.Text;
            string usernameText = ((MainWindow)Application.Current.MainWindow).usernameBox.Text;
            string buyerText = ((CreditWindow)Application.Current.MainWindow).buyerBox.Text;
            string itemText = ((CreditWindow)Application.Current.MainWindow).itemBox.Text;
            string amountText = ((CreditWindow)Application.Current.MainWindow).amountBox.Text;
            string typeText = ((CreditWindow)Application.Current.MainWindow).typeBox.Text;
            string reasonText = ((CreditWindow)Application.Current.MainWindow).reasonBox.Text;

        string copyText = "";

        Clipboard.SetDataObject(copyText);
    }

Когда я запускаю этот код, я получаю сообщение об ошибке от Visual Studio в этой строке:

string buyerText = ((CreditWindow)Application.Current.MainWindow).buyerBox.Text;

, в котором говорится "Невозможно привести объект типа 'MSONotes.MainWindow' к типу 'MSONotes.CreditWindow'.

1 Ответ

0 голосов
/ 18 января 2019

Ошибка в том, что Application.Current.MainWindow - это главное окно всего приложения. Он не меняется независимо от того, сколько существует дочерних окон. Это не станет CreditWindow.

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

  • Эти текстовые поля будут привязаны к полям в модели представления
  • Нажатие кнопки подтолкнет значения к некоторой модели (совместно используемой виртуальными машинами другого окна, в идеале с использованием внедрения зависимостей)
  • Через событие или подобное сервис уведомит все виртуальные машины о доступности новых данных
  • Они обновят свои собственные соответствующие поля

  • Другие окна будут обновляться автоматически из-за обновления виртуальной машины.

По сути, вам нужно будет правильно сделать WPF (с MVVM), а не собирать его вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...