Как привязать одноэлементное свойство в Silverlight 4? - PullRequest
9 голосов
/ 15 марта 2011

Привет всем первым постом здесь :) Давайте начнем с фрагмента кода, который я использую:

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 ]

8 голосов
/ 15 марта 2011

Советую добавить дополнительный класс MyClassProvider:

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

Экземпляр этого класса вы можете разместить в любом месте и привязать к его свойству MyClass.

5 голосов
/ 15 марта 2011

Вы можете иметь свой UserControl, внутренне, выставить экземпляр MyClass через его собственное свойство и привязать локально к своему собственному экземпляру MyClass.Поскольку это Singleton, это всегда будет один и тот же экземпляр.

4 голосов
/ 15 марта 2011

Вы можете реализовать синглтон немного по-другому, например:

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

обратите внимание, что синглтон по-прежнему является синглтоном, но мы просто обходим отсутствие статического Silverlight, не устанавливая геттер как статический.

3 голосов
/ 06 февраля 2012

Я убедился, что в Silverlight 5 работает следующее:

Оставьте свой класс MyClass без изменений, затем создайте свойство MyClass с именем MyClass в вашем бизнес-классе UserControl:

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, вышеуказанная привязка будет обновлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...