尝试在WPF窗口之间共享对象

3
我在我的 WPF 应用程序的 MainWindow 中实例化一个类,然后在单击事件中将该对象传递到第二个窗口。但是当我尝试在 Window_Loaded 方法中运行我传递给第二个窗口的对象的方法时,会出现以下错误:

当前上下文中不存在 object 的名称。

这是我的 MainWindow 代码:
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }


    Object objectName;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
            objectName = new Object();
            objectName.Text = "text";




    }
    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        Settings settingsWindow = new Settings(objectName);
        settingsWindow.Show();
    }
}

以及设置窗口:

public partial class Settings : Window
{
    public Settings(Object object)
    {
        InitializeComponent();
    }

    private void SettingsWindow_Loaded(object sender, RoutedEventArgs e)
    {
        // get text in object
        String name = object.Text;
    }
}

我可以把对象传递到窗口中,但如何在新窗口的 Window_Loaded 方法中使用它?


1
你正在传递对象,但是在设置窗口中没有对它的引用,因为你没有在构造函数中将它存储在本地。 - Xeun
5
使用“ViewModel”,了解MVVM。 - Patrick Hofman
2个回答

3

在设置中不需要实例化对象。

使用:

public partial class  Settings: Window
{
    Object _object;

    public Settings(Object object)
    {
        _object = object
        InitializeComponent();
    }

    private void SettingsWindow_Loaded(object sender, RoutedEventArgs e)
    {
        // get text in object
        String name = _object.Text;
    }

另外还有一些离题的提示:

  • 使用 MVVM 模式
  • 不要直接使用对象,而是使用更具体的类类型(创建自己的类)。
  • 将设置(Settings)重命名为设置窗口(SettingsWindow),因为您很可能还有一个包含数据的设置类。

开始时可能会让人感到不知所措,但如果你进入更大的程序(带有单元测试),真的会收到回报。 - Michel Keijzers

2

您在一些不同的事情上出错了。首先,您不能使用对象来进行此语法。您只能通过使用反射或将其转换为字典来遍历它。因此,最好实际上为其创建一个类:

class MyClass{
  public string Text;
}

现在在您的设置窗口更改此项:

MyClass 对象名称;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        objectName = new MyClass();
        objectName.Text = "text";
}

而最后你需要改变的是另一个表单,它会看起来像这样:

public partial class  Settings: Window
{
    MyClass _object;

    public Settings(Object object)
    {
        _object = object
        InitializeComponent();
    }

    private void SettingsWindow_Loaded(object sender, RoutedEventArgs e)
    {
        // get text in object
        var name = _object.Text;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接