在两个wpf窗口之间共享一个类

本文关键字:共享 一个 之间 wpf 两个 窗口 | 更新日期: 2023-09-27 18:27:56

我想在至少两个wpf窗口之间共享以下类:

namespace WPF
{
    class dd_internals  
    {
        public int current_process_index;
        public class process_class
        {
           public string process_name;
           public List<string> parm_list;
           public List<string> var_list;
           public List<string> statements;
       }
       public List<process_class> process_list = new List<process_class>();
   }
}

如何在多个窗口之间共享此类的单个实例?

Ok代码,显示dd_internals被传递到window1的构造函数中,但不能直接在window1的成员函数中使用。

namespace posting2
{
    public partial class Window1 : Window
    {
        public void Member()
        {
            int y = Data.current_process_index;
            // Error: the name 'Data' does not exist in the current context
        }
        public Window1(dd_internals data)
        {
            int x = data.current_process_index;
            // ok, it works here.
            InitializeComponent();
        }
    }
}

在两个wpf窗口之间共享一个类

有几个选项,例如:

  1. 正如我所猜测的,一个窗口可以打开另一个窗口,所以你可以在打开它之前将这个对象的实例传递给第二个窗口
  2. 您可以将其存储在Application.Properties 中

    Application.Current.Properties["Key"]=myobject;

  3. 对于更大的应用程序,最好的选择是使用一些依赖容器(有很多实现),并将共享对象存储在这样的容器中

  4. 我真的不喜欢singleton模式,因为它实际上不是一个模式,但你也可以使用它
var dd = new dd_internals();
var window1 = new YourWindow(dd);
var window2 = new YourWindow(dd);

dd所做的任何更改都将在所有窗口实例中可用。如果您需要处理诸如多线程之类的事情,或者让dd在某个东西发生更改时调用某个东西,那么您需要将其添加到您的问题中。

您的编辑在语法上无效;C#区分大小写,因此Datadata是两个不同的标识符,其中一个未声明。我猜你想要这样的东西:

public partial class Window1 : Window
{
    private readonly dd_internals myDd;
    public void Member()
    {
        int y = myDd.current_process_index;
    }
    public Window1(dd_internals data)
    {
        InitializeComponent();
        myDd = data;
    }
}

在你的真实项目中,请使用比"数据"、"Window1"等更好的名称。这些名称没有任何意义;在一个简短的例子中,它们很有用,但很快就会让一个真正的程序变得不可理解。

您可以使类成为singleton

 public  class dd_internals
    {
        private static dd_internals instance;
        public static dd_internals singleInstance;
        private dd_internals() { }
        public static dd_internals Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new dd_internals();
                }
                return instance;
            }
        }
        public int current_process_index;
        public class process_class
        {
            public string process_name;
            public List<string> parm_list;
            public List<string> var_list;
            public List<string> statements;
        }
        public List<process_class> process_list = new List<process_class>();
    }

在任何地方共享该类之前,我认为您需要将其公开或内部化。