2013-12-13 67 views
1

我有一個叫做NotificationScheduler的單例類。我真的只可能在我的應用程序中有這些。單件模式是通過「實例」屬性實現,只能通過這個屬性這樣訪問實例:在XAML中使用單例 - 可能嗎?

private static NotificationScheduler _instance = null; 
    public static NotificationScheduler Instance 
    { 
     get { return _instance ?? (_instance = new NotificationScheduler()); } 
    } 

    public NotificationScheduler() 
    { 
#if DEBUG 
     if (_instance != null) 
      Debug.WriteLine(
       "WARN: A second Instance of NotificationScheduler has been created"); 
#endif 
     _instance = this; 
     init(); 
    } 

但我也有一個原因要在XAML中創建這樣的:

 <NotifyIcon:NotificationScheduler x:Key="NotificationScheudlerInstance" 
         IconSource="/Images\Icons/myicon.ico" 

我知道這不使用實例屬性!這甚至可能嗎?如果我訪問實例在這樣的代碼,一個實例被創建過程中的兩次:

NotificationScheduler.Instance.DoSomething(); 
NotificationScheduler n = (NotificationScheduler) FindResource("NotifyIcon"); 
n.DoSomething(); 

此刻,我的解決辦法是做FindResource事情通過XAML代碼來創建實例,然後一切正常精細。

問題:我可以通過訪問靜態屬性在XAML中創建資源嗎?

+0

每當我聽到單身人士,我去這裏:http://csharpindepth.com/articles/general/singleton.aspx – Rudi

+0

除了下面關於.NET 4.5和靜態的答案。一種可能性是管理工廠或IOC庫中支持單例的類接口之外的單例。 – kenny

+0

@Rudi是的,這是我們給受訪者閱讀的一些代碼來自的帖子。但它與這個問題無關;-) – Akku

回答

3

爲什麼不只在您的第一個代碼段中擁有一個singleton屬性,並在XAML中使用{x:Static NotifyIcon:NotificationScheduler.Instance}來引用它?如果它是單身人士,它不應該是一個範圍內的資源。

+1

如果這樣做的話,這將是理想的解決方案,也是我對WPF知識的一個漏洞。聽起來像我必須儘快嘗試。 – Akku

+0

很酷,讓我知道它是如何工作的。 –

+0

這似乎是最好的事情。所以你不能通過引用一個靜態屬性來創建一個XAML實例,但是如果你需要綁定到一個單例實例的屬性,你可以使用它來綁定它。謝謝!這將使我的代碼更清潔。哦,它也適用於.NET 4.0(我測試它)。 – Akku

0

您可以綁定到.Net 4.5中的靜態屬性;更多here

+0

你不需要綁定一個單例,因爲根據定義,這個值永遠不會改變。最好只使用「{x:Static}」。 –

1

不是試圖在XAML中創建單例,爲什麼不創建一個可以有多個實例的控件,但是所有這些實例都引用靜態對象或單例對象?我認爲這可能會隨着時間的推移而更容易管理。

+0

這會工作,但也很像看起來像一個黑客。但如果沒有更多有用的東西出現,我傾向於這樣。 – Akku

相關問題