Синхронизация данных между двумя окнами в WPF - PullRequest
0 голосов
/ 03 июля 2018

Я разрабатываю приложение в WPF. Мне нужно загрузить экземпляр класса Window (который я называю Win1 здесь), которым заполнена форма. Затем, когда нажата кнопка «Отправить», Win1 закрывается, и только тогда может быть загружено новое окно Win2 (другой класс, также унаследованный от Window). Проблема в том, что они оба открываются, и я не могу синхронизировать данные, полученные с первого Win1 , и передать их на второй Win2 . Я просто облажался.

Кто-то может дать мне общую идею с указанием инструментов и схемы, которые мне нужны для выполнения вышеизложенного. Для данных спецификаций необходимо, чтобы Win2 появился только после того, как Win1 завершил свою работу.

Несмотря на то, что приложение является более сложным, чем я описал его сейчас, я хотел бы опубликовать некоторый код, но мне удается запутать представления о том, кто меня читает, поэтому я говорю вам, что в данный момент я управляю окна внутри конструктора App.cs, в то время как MainWindow.cs соответствует Win2 , и я создал новый класс для реализации Win1 .

public partial class App : Application
{
   // Params...

   public App()
   {
       Client = LoadNetwork();
       User = LoadUser(Client); // Shows Win1
       Games = LoadMinigames();
       mainWindow = new MainWindow(User, Games);
       Application.Current.MainWindow = mainWindow; // On XAML default is Hidden
       mainWindow.Show(); // Shows Win2
   }

   // Other methods...

}

Самая большая проблема для меня - передать данные User в MainWindow , и у меня не так много идей о том, как справиться с этим делом.


Обновление

public partial class MainWindow : Window
{
    public UserLoading ul;
    public UserRegistering ur;
    public User.UserProfile User;
    private List<Game.Game> Games;
    public Label Username;

    public MainWindow(User.UserProfile user, List<Game.Game> games)
    {
        User = new UserProfile();
        InitializeComponent();
        User = user;
        Games = games;
        Username.Content = User.Username;

        DrawList(Games);
    }

    //...

}

Я понимаю, что немного объяснил себе, что несколько раз перечитал свой вопрос. Поэтому я пытаюсь прояснить ситуацию, сообщив здесь мой ответ на один из комментариев.

Метод UserLoad не блокирует, потому что внутри него создаются экземпляры классов, которые наследуют Window (другие окна для входа в систему и регистрации другими словами), затем поток выполнения продолжается и создает экземпляр MainWindow, где, естественно, аргумент «user» приведет к нулю потому что формы еще не были заполнены. Теперь я понимаю, что, возможно, я плохо себя объяснил. Вызов Win1 не блокируется, и я хотел бы, чтобы он возвращался только тогда, когда пользовательские данные готовы для передачи в качестве аргумента в Win2.

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Как уже упоминал пользователь Nawed, вы должны читать в MVVM. Синхронизация может быть достигнута при использовании одной и той же модели для двух разных представлений.

Вы могли бы сделать что-то вроде этого.

var sharedContext = new MyViewModel();

var viewOne = new MyWindow();
var viewTwo = new MyUserControl();

viewOne.DataContext = viewTwo.DataContext =  sharedContext;
0 голосов
/ 03 июля 2018

Я делал это в прошлом. вот мое решение:

Установите окно запуска на Win1. Пусть это запустят. Создайте статический метод в App.cs для запуска Win2. Когда Win1 нормально закрывается и вы хотите, чтобы Win2 открывала, вызовите App.ShowMainWindow (this) из Win1.

App.cs

public partial class App : Application
{

    static internal void ShowWin2(Win1 win1)
    {
        Win2 win2 = new Win2();
        // Copy Win1 stuff to Win2 here
        Application.Current.MainWindow = win2;
        win2.Show();

    }
}

Win1

public partial class Win1 : Window
{
    public Win1()
    {
        InitializeComponent();
    }

    private void CloseAndLaunchWin2()
    {
        App.ShowWin2(this);
        this.Close();

    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        CloseAndLaunchWin2();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...