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
相关产品推荐
相关产品推荐

