【问题标题】:How to pass a value from Page in Window 2 to Page in Window 1 WPF如何将值从窗口 2 中的页面传递到窗口 1 WPF 中的页面
【发布时间】:2019-08-26 13:56:58
【问题描述】:

我有 2 个窗口(窗口 1 和窗口 2)。在窗口 2 上,我使用 ShowDialog 隐藏窗口 1。

从窗口 1(页面 A)我单击一个按钮,将我带到窗口 2(页面 B)。窗口 2(页面 B)上发生了一个操作,我必须将处理后的答案传递回窗口 1(页面 A)。

我在窗口 1(页面 A)的顶部有一个名为 ProcessedAnswer 的变量,一旦编译器从 ShowDialog 运行,我就会调用值 ProcessedAnswer。

有没有办法在不同窗口的页面之间传递这个值而不创建页面的新实例?

【问题讨论】:

  • 应该有一个主视图模型。窗口 1 和窗口 2 的视图模型应该是该主视图模型的属性,页面视图模型应该分别是窗口 1 和窗口 2 的属性。主视图模型应该负责管理这种关系:一种常见的方法是 ProcessedAnswer 成为另一个子视图模型的一部分,并且两个页面都将被引用到该子视图模型的共享实例。您还可以给 PageB 一个在操作完成时引发的事件。 MainViewModel 将在该事件中添加一个处理程序...
  • ...while viewmodel 树被创建,处理程序将分配this.Win1ViewModel.PageA.ProcessedAnswer = this.Win2ViewModel.PageB.ProcessedAnswer;。很多人会建议使用现有的PropertyChanged 事件而不是添加新事件。这也不是一个坏主意。在您的情况下,听起来 Win1 的视图模型可能与 Win2 的视图模型有直接联系。在这种情况下,Win1 可以将处理程序添加到该事件,并将主视图模型排除在外。

标签: c# wpf


【解决方案1】:

通过 MVVM 设计模式,我建议您在 Windows 1 中使用 ViewModel 并将其传递给 Windows 2。如下所示:

Windows1.cs

ViewModel2 vm2 = new ViewModel2();
...
windows2.DataContext = vm2;
if(windows2.ShowDialog() == true)
{
    ProcessedAnswer = vm2.something;
}

Windows2.cs

(DataContext as ViewModel2).something = somevalue;//here you can modify the passing value and pass it when ShowDialog finish

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多