2011-09-21 14 views
1

假設我有3類來處理所有的數據庫相關的請求:如何將實例傳遞給WPF Window類?

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

,我得到了2個窗口與用戶進行交互:

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

爲窗口1 &窗口2需要與數據庫進行交互,他們需要使用前面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 ca n處理所有與數據庫相關的請求,現在我需要將一個DataHandler的時間傳遞給window1和window2。

我試着用參數重寫window1和window2的構造函數,但它不允許我這樣做。後谷歌我知道,WPF窗口窗體不允許帶參數的構造函數。

有沒有辦法將我的DataHandler傳遞給兩個窗體的窗體類?

+2

您不能將它設置爲兩個窗口上的屬性嗎? – AlexD

+0

我其實誤解了MVVM的概念。將其設置爲屬性是實現它的正確方法。 – qkzhu

回答

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

類似地,寫其他窗口類。

或者更好的是,應用MVP模式的一些變體,最有可能的是MVVM。閱讀這些文章:

+0

謝謝,MVVM更好:P – qkzhu

+0

@zqkun:是的。當然。 MVVM是WPF最自然的模式。 – Nawaz

0

難道你不能讓DataHandler類成爲單例,並在需要的地方使用它的方法,而無需重新實例化該類?

0

你可以在你的Window構造函數中有參數。或者,您可以通過屬性傳遞它,將DataHandler對象設置爲某個公共靜態屬性,或者甚至僅讓DataHandler成爲靜態類。

0

有任何數量的方式來做到這一點。

你可以讓DataHandler單身。

由於DataHandler具有無參數構造函數,因此可以在應用程序的資源字典中創建它,並讓對象使用FindResource來獲取它。

在使用MVVM模式的實現中,您會看到很常見的一種模式,即視圖模型包含對共享對象的引用,並且窗口通過綁定可以訪問它們,但我非常懷疑,重新使用MVVM。

+0

你說得對,在我的情況下使用DataHandler並不好。在花費時間瞭解MVVM概念之後,我通過了對視圖模型的引用,並且它工作正常。 – qkzhu

1

是的,你可以有多種方法可以做到這一點,

  1. 你讓你的DataHandler單身。 (我不喜歡這個)
  2. 將一個公共靜態屬性添加到app.xaml.cs中,該屬性包含一個DataHandler類的實例,並在您的Windows構造函數中從應用程序中獲取該屬性。 (這是更好的方法)
  3. 添加一個ViewModel,並讓該視圖模型將數據呈現給Windows。 (我更喜歡這個!) 如果你需要一個例子,讓我知道哪一個適合你,我會提供一個。
相關問題