2013-12-13 29 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

相关问题