【问题标题】:Syncing data between two Window in WPF在 WPF 中的两个窗口之间同步数据
【发布时间】:2018-07-09 22:59:45
【问题描述】:

我正在 WPF 中开发一个应用程序。我需要加载一个填充表单的 Window 类的实例(我在这里称之为 Win1)。然后,当单击提交按钮时,Win1 关闭,然后才能加载新的 Win2 窗口(另一个类,也继承自 Window)。问题是它们都打开了,我无法同步从第一个 Win1 获得的数据并将它们传递给第二个 Win2。我只是搞砸了。

有人可以给我一个通用的想法,指出我需要执行上述操作的工具和模式。对于给我的规范,Win2必须在Win1完成工作后才出现。

尽管应用程序比我现在描述的要复杂,但我想发布一些代码,但我设法混淆了谁在阅读我的想法,所以我告诉你,目前我正在管理在 App.cs 的构造函数中的 windows,而 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);
    }

    //...

}

我意识到我已经向自己解释了一些“重读我的问题好几次”。因此,我通过在此处报告我对其中一位 cmets 的回答来更新它以使其更清晰。

UserLoad 方法不是阻塞的,因为它内部是继承 Window 的实例化类(换句话说,用于登录和注册的其他窗口)然后执行流程继续并实例化 MainWindow,其中参数“user”自然会导致 null因为表格还没有填写。我现在意识到,也许我对自己的解释很糟糕。 Win1 的调用没有阻塞,我希望它仅在用户数据准备好作为参数传递给 Win2 时返回。

【问题讨论】:

  • 发布您的 MainWindow 构造函数...应该看起来像 public MainWindow(UserType user, GamesType games){}
  • 您有几个问题。从将代码移出构造函数开始(使用event 或覆盖App)。任何不在 wpf 中使用 MVVE 的人都必须尽快研究它。然后你的“同步”基本上是从另一个视图模型中调用一个视图模型的成员。
  • 老实说,我什至不知道我做事是否正确。如果你觉得这种方法完全错误,我有时间研究一些手册,所以不要麻烦告诉我贴的代码很烂! :-P
  • 但是话说回来……为什么你传球有困难,看起来你的传球做得正确?有什么问题?
  • @kitsune 正如 Nawed 所说,您应该阅读 MVVM。可以通过对两个不同的视图使用相同的模型来实现同步。

标签: c# wpf synchronization


【解决方案1】:

我过去曾这样做过。这是我的解决方案:

将启动窗口设置为 Win1。让它启动。在 App.cs 中创建一个静态方法来启动 Win2。当 Win1 可以关闭并且您希望 Win2 从 Win1 中打开调用 App.ShowMainWindow(this) 时。

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();
    }
}

【讨论】:

  • 原谅这个问题(可能从你的角度来看会很白痴,但它不适合我)。如何以及在哪里可以调用 App: Application 的 ShowWin2 功能?通常我是在 App 构造函数中完成的。
  • 正如我在 Win1 代码中显示的那样,您在代码中调用 App.ShowWin2(this),您对 Win1 已达到其目的并准备启动 Win2 并关闭 Win1 感到满意。在我的示例中,我有一个按钮单击 Win1,调用 CloseAndLaunchWin2();它调用 App.ShowWin2(this) 然后关闭 win1。
  • 在我创建的示例 .Net C# 应用程序中,我创建了两个窗口 Win1 和 Win2。 Win1 我添加了 1 个带有点击事件的按钮。我在App.cs文件中添加了静态方法ShowWin2,在上面列出的Win1中添加了代码。
【解决方案2】:

正如用户 Nawed 所说,您应该阅读 MVVM。可以通过对两个不同的视图使用相同的模型来实现同步。

你可以这样做。

var sharedContext = new MyViewModel();

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

viewOne.DataContext = viewTwo.DataContext =  sharedContext;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多