【问题标题】:How to pass instances to WPF Window class?如何将实例传递给 WPF Window 类?
【发布时间】:2011-11-22 06:09:27
【问题描述】:

假设我有 3 个类来处理所有与数据库相关的请求:

public class DB_A{}
public class DB_B{}
public class DB_C{}

我有 2 个窗口与用户交互:

window1.xaml;window1.xaml.cs;
window2.xaml;window2.xaml.cs

由于window1 & window2需要与数据库交互,他们需要使用前3个类的函数,我创建了一个DataHandler类:

public class DataHandler
{
    public DB_A a;
    public DB_B b;
    public DB_C c;

    public DataHandler()
    {
        a = new DB_A();
        b = new DB_B();
        c = new DB_C();
    }

    //some functions... ...
}

现在DataHandler 类可以处理所有与数据库相关的请求,现在我需要将DataHandler 的瞬间传递给window1 和window2。

我尝试使用参数重新编写 window1 和 window2 的构造函数,但它不允许我这样做。 google 后我知道 WPF 窗口窗体不允许带参数的构造函数。

有什么方法可以将我的 DataHandler 传递给两个窗体类吗?

【问题讨论】:

  • 你不能将它设置为两个窗口的属性吗?
  • 其实我误解了MVVM的概念。将其设置为属性是实现它的正确方法。

标签: c# .net wpf


【解决方案1】:

DataHandler 设为单例,并让窗口类访问它。

public class DataHandler
{
    //singleton instance
    static DataHandler _instance = new DataHandler ();

    public DataHandler Instance
    {
          get { return _instance; }
    }
};

那么,

public partial class Window1 : Window
{
   DataHandler _dataHandler;

   public Window1()
   {
        InitializeComponent();

        _dataHandler = DataHandler.Instance;
   }
}

同样,写其他的Window类。

或者更好的是,应用一些 MVP 模式的变体,最有可能的是 MVVM。阅读这些文章:

【讨论】:

  • @zqkun:是的。当然。 MVVM 是 WPF 最自然的模式。
【解决方案2】:

是的,你可以,有多种方法可以做到这一点,

  1. 您将 DataHandler 设为单例。 (我不喜欢这个)
  2. 向 app.xaml.cs 添加一个公共静态属性,该属性具有您的 DataHandler 类的实例,并在您的 Windows 构造函数中从应用程序中获取该属性。 (这是一种更好的方法)
  3. 添加一个 ViewModel 并让该视图模型将数据呈现给两个 Windows。 (我更喜欢这个!) 如果您需要示例,请告诉我哪一个适合您,我会提供一个。

【讨论】:

    【解决方案3】:

    您不能将 DataHandler 类设为单例并在您想要的任何地方使用它的方法,而无需重新实例化该类吗?

    【讨论】:

      【解决方案4】:

      您可以在 Window 构造函数中设置参数。或者,您可以通过属性传递它,将您的 DataHandler 对象设置为某处的公共静态属性,或者甚至只是将您的 DataHandler 设为静态类。

      【讨论】:

        【解决方案5】:

        有很多方法可以做到这一点。

        您可以将DataHandler 设为单例。

        由于DataHandler有无参构造函数,你可以在应用的资源字典中创建它,让对象使用FindResource来获取。

        在使用 MVVM 模式的实现中,您会很常见的一种模式是视图模型包含对共享对象的引用,并且窗口可以通过绑定来访问它们,尽管我非常怀疑您是使用 MVVM。

        【讨论】:

        • 你说得对,在我的情况下使用 DataHandler 不好。在花时间理解了 MVVM 概念之后,我将引用传递给了视图模型,它工作正常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多