【问题标题】:Properly passing values between windows c# wpf without binding在没有绑定的情况下在 windows c# wpf 之间正确传递值
【发布时间】:2015-04-29 13:20:21
【问题描述】:

我有一个窗口 Window1

 Window1 posta= new Window1();
 posta.ShowDialog();

我继续处理posta 中的一些变量。我想将结果变量/整个方法返回给MainWindow。 我知道我可以在posta 中有全局变量,然后通过检索它们

 if(posta.DialogResult()==true){
   int wantedValue = posta.varResult; // varResult being the global variable of Window1
 };

但这似乎是一种糟糕且低效的方法。 我尝试了以下操作,在 Window1 中有一个名为 myButton

的按钮
 Window1 posta= new Window1();
 posta.myButton.MouseRightButtonDown += myButton_RMBdown;
 posta.ShowDialog();


public void myButton_RMBdown(object Sender, MouseButtonEventArgs e){
// can access MainWindow variables but cant get to Window1 variables
}

有人愿意帮忙吗?

编辑:不使用数据绑定

【问题讨论】:

  • 将变量添加到 MainWIdow 构造函数
  • @apomene 如果他关闭他的 MainWindow 就可以了,但如果他想保持他的 MainWindow 保持打开状态就不行了。
  • 你可以通过参数调用windows,返回你需要的值。但是在那个窗口的承包商中,你必须定义参数和返回值的类型。
  • 创建一个视图模型。在网上搜索 MVVM 和 WPF 数据绑定。

标签: c# wpf events window


【解决方案1】:

如果您遵循 MVVM 方法,您将创建一个 ViewModel,调用您的对话框,将其 DataContext 属性设置为您的 ViewModel,然后在 ShowDialog 完成后查询 ViewModel 实例。然后,您的对话框视图将通过 Xaml 绑定到视图模型

Window1 posta = new Window1();
var viewModel = new MyWindowViewModel();
posta.DataContext = viewModel;
posta.myButton.MouseRightButtonDown += myButton_RMBdown;
if (posta.ShowDialog())
{
    // Do things with the result
    viewModel.SomeProperty...
}

【讨论】:

    【解决方案2】:

    您可以使用VisualTreeHelper 获取控件的父级。因此,拥有sender(即按钮),您可以像这样访问Window1

    //Some where in the MainWindow
    public void myButton_RMBdown(object Sender, MouseButtonEventArgs e){
        var parent = VisualTreeHelper.GetParent(sender as Button);
    
        while (!(parent is Window1))
        {
            parent = VisualTreeHelper.GetParent(parent);
        }
    
        (parent as Window1).DoStuff();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多