如何绑定到Silverlight 4中的单例属性?

时间:2011-03-15 00:00:19

标签: c# .net silverlight mvvm silverlight-4.0

大家好先发帖:) 让我们从我正在使用的代码片段开始:

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作为静态资源:

<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上绑定?

有什么想法吗?

提前致谢!

4 个答案:

答案 0 :(得分:8)

我建议添加其他课程MyClassProvider

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

此类的实例可以放在任何位置并绑定到其MyClass属性。

答案 1 :(得分:5)

你可以让你的UserControl在内部通过它自己的属性公开MyClass实例,并在本地绑定它自己的“MyClass”实例。因为它是一个单身人士,所以这将始终是同一个实例。

答案 2 :(得分: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}">

注意单例仍然是单例,但我们只是通过不将getter设置为静态来绕过Silverlight缺少的静态。

答案 3 :(得分:3)

我已经验证以下是在Silverlight 5中工作的:

保持您的班级MyClass不变,然后在您的商家UserControl类中创建名为MyClass的{​​{1}}属性:

MyClass

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

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

在您的应用中的某个位置<TextBlock Text="Visibility Test" Visiblity="{Binding Path=MyClass.MyProperty, Converter={somexmlns:SomeVisiblityConverterIfNecessary}", ElementName="yourBusinessUserControlName"/> (此处MyClass.Instance.MyProperty是类名称)更改MyClass的值后,上述绑定将会更新。