You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF不同类间共享值时另一窗口读取Options类属性为空问题

问题根因
  • 核心问题是两个窗口操作的不是同一个Options实例:你在MainWindow中赋值的是已经创建好的某个options对象,但在getUpdateEntries方法中用new Options()重新创建了一个全新的Options实例,这个新实例的Title属性从未被赋值,默认值为null,因此文本框显示为空。
  • 注意代码一致性问题:你在MainWindow中赋值的是小写的options.title(看起来是类的私有字段),而Options类对外公开的属性是大写的Title,如果你的代码中实际确实是直接赋值私有字段,也建议修改为走公开属性Title赋值,避免逻辑异常。
常用解决方案

方案1:用静态单例实现全局共享实例

在Options类中添加全局唯一的静态实例,所有窗口都复用这个实例进行读写:

public class Options
{
    // 全局唯一实例
    private static Options _instance;
    public static Options Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Options();
            return _instance;
        }
    }

    private string title;
    public string Title
    {
        get { return title; }
        set { title = value; }
    }
}

修改MainWindow的赋值逻辑:

Options.Instance.Title = Convert.ToString((showEntries.SelectedItem as DataRowView).Row["title"]);

修改updateDatabase窗口的取值逻辑,不需要再new新实例:

private void getUpdateEntries()
{
    titleBox.Text = Options.Instance.Title;
}

方案2:构造函数传参

打开updateDatabase窗口时,把MainWindow中已经赋值的Options实例通过构造函数传递过去,直接用传入的实例取值即可。

方案3:将Options属性改为静态属性

直接将Options类的属性定义为静态属性,不需要实例化即可跨窗口读写:

public class Options
{
    public static string Title { get; set; }
}

读写都直接通过类名访问:Options.Title = "xxx"、titleBox.Text = Options.Title


内容的提问来源于stack exchange,提问作者Sebbi Pienkowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:27:04