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

时间:2015-12-23 16:52:56

标签: c# wpf

我想在至少两个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>();
   }
}

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

好的代码显示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();
        }
    }
}

4 个答案:

答案 0 :(得分:3)

有几个选项,例如:

  1. 我可以猜到一个窗口可以打开另一个窗口,因此您可以在打开它之前将该对象的实例传递给第二个窗口。
  2. 您可以将其存储在Application.Properties

    Application.Current.Properties [“Key”] = myobject;

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

  4. 我真的不喜欢单身模式,因为它实际上不是一种模式,但你也可以使用它。

答案 1 :(得分:1)

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”等更好的名称。这些名字并不意味着什么;在一个简短的例子中,它们很有用,但它们很快就使一个真正的程序难以理解。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你可以制作班级单身人士

 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>();
    }