2011-03-15 62 views
9

大家的第一篇文章在这里:) 让我们开始与我使用的代码片段:如何绑定到Silverlight 4中的单例属性?

public MyClass : INotifyPropertyChanged 
{ 
    private static MyClass _instance; 
    public static MyClass Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new MyClass(); 
      return _instance; 
     } 
    } 

    private bool _myProperty; 
    public bool MyProperty 
    { 
     get 
     { 
     return _myProperty; 
     } 
     set 
     { 
      if (_myProperty!= value) 
      { 
       _myProperty= value; 
       NotifyPropertyChanged("MyProperty"); 
      } 
     } 
    } 

    private MyClass() { ... } 
} 

正如你所看到的,它是一个单例类。 在我看来,我想绑定MyProperty上的控件。我最初的想法是使用类似导入MyClass的在我看来,一个静态的ressource:

<UserControl x:Class="Metrics.Silverlight.ChartView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:logic="clr-namespace:Metrics.Logic;assembly=Metrics.Logic"> 
    <UserControl.Resources> 
    <logic:MyClass x:Key="myClass" /> 
    </UserControl.Resources> 
</UserControl> 

,并将其绑定像这样:

<Button Margin="5" Click="btnName_Click" Visibility="{Binding Source={StaticResource myClass}, Converter={StaticResource visibilityConverter}, Path=MyAttribute, Mode=OneWay}"> 

当然,这种方法不会因为MyClass的构造函数的工作是私人的。我也无法使用x:static,因为它在Silverlight 4中不可用。

我一直在这个问题上停留的时间比我应该的要长得多...... 我该如何绑定MyProperty?

任何想法?

提前致谢!

回答

5

您可以让UserControl在内部通过它自己的属性公开MyClass实例,并将其本地绑定到它自己的“MyClass”实例。由于它是一个Singleton,所以它将始终是同一个实例。

+0

嗨M.科普塞,我想尝试一下你的建议,但我必须承认,我不太明白如何解决这个问题。我仍然不熟悉silverlight/xaml编程。我会很感激,如果你能详细说明:) – Mathieu 2011-03-15 12:38:42

+0

@Tigel:这与Elad的选项基本相同。我只是建议单独离开你的单身人士,但在你的控制本身(非静态)有一个属性返回单身人士。 – 2011-03-15 16:04:09

+0

好的问题解决了。感谢您的帮助先生们! @Vladimir Dorokhov @Reed Copsey @Elad Katz – Mathieu 2011-03-15 17:16:43

4

您可以实现单件略有不同,就像这样:

private static MyClass _instance; 
    public MyClass Instance // note the getter is not static 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new MyClass(); 
      return _instance; 
     } 
    } 

所以现在你可以做在XAML如下:

<UserControl x:Class="Metrics.Silverlight.ChartView" 
    <UserControl.Resources> 
    <logic:MyClass x:Key="myClass" /> 
    </UserControl.Resources> 
</UserControl> 

,并将其绑定这样的:

<Button Margin="5" Click="btnName_Click" Visibility="{Binding Source={StaticResource myClass}, Converter={StaticResource visibilityConverter}, Path=Instance.MyAttribute, Mode=OneWay}"> 

注意到单身仍然是一个si ngleton,但我们只是绕过Silverlight缺少的静态,因为没有将getter设置为静态。

+0

我必须等到明天再试试,但这看起来像一个很好的解决方法。但是,在静态成员上没有静态获取器是否被认为是良好的做法?没有getter静态的结果是什么? – Mathieu 2011-03-15 02:02:42

+0

不是太多..在Silverlight中实现MVVM时,在由Laurent Bugnion(mvvmlight)设计的ViewModelLocator模式中,经常使用它。它被广泛接受。 – 2011-03-15 02:05:14

+0

我记得在我的代码中的一些地方,我需要通过“MyClass.Instance.SomeMethod”调用来访问我的单例。如果吸气剂不是静态的,这将不可能。 – Mathieu 2011-03-15 12:29:30

8

我建议添加额外的类MyClassProvider

public class MyClassProvider 
{ 
    public MyClass MyClass { get { return MyClass.Instance; } } 
} 

这个类的实例,你可以在任何地方放置和绑定到其MyClass财产。

3

我已经验证下面是在Silverlight 5个工作:

使你的类MyClass不变,然后在您的企业用户控件类中创建的MyClassMyClass名称的属性:

public MyClass MyClass 
{ 
    get { return <Namespace>.MyClass.Instance; } 
} 

然后在您的业务UserControl XAML,做这样的绑定:

<TextBlock Text="Visibility Test" Visiblity="{Binding Path=MyClass.MyProperty, Converter={somexmlns:SomeVisiblityConverterIfNecessary}", ElementName="yourBusinessUserControlName"/> 

一旦某些地方在你的应用程序中,MyClass.Instance.MyProperty(这里MyClass是类名)改变了MyProperty的值,上面的绑定会被更新。

+0

这应该也适用于Silverlight 4和WP7.1。 – 2012-06-19 02:43:35

相关问题