2011-03-15 10 views
9

Hola a todos primer post aquí :) Vamos a empezar con un fragmento del código que estoy usando:¿Cómo enlazar a una propiedad singleton en 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() { ... } 
} 

Como se puede ver, se trata de una clase Singleton. En mi opinión, quiero vincular un control en MyProperty. Mi idea inicial era importar MiClase como ressource estática en mi opinión, usando algo como:

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

y enlazarlo así:

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

Por supuesto, este enfoque no funcionará desde MiClase constructor es privado. Tampoco puedo usar x: static ya que no está disponible en Silverlight 4.

He estado atascado en este problema mucho más tiempo de lo que debería ... ¿Cómo puedo enlazar MyProperty?

¿Alguna idea?

¡Gracias de antemano!

Respuesta

5

Puede tener su UserControl, internamente, exponer la instancia MyClass a través de su propia propiedad, y vincular localmente a su propia instancia "MyClass". Como es un Singleton, esta siempre será la misma instancia.

+0

Hola M. Copsey, me gustaría probar tu sugerencia, pero debo admitir que no entiendo muy bien cómo abordar esto. Todavía soy nuevo en la programación silverlight/xaml. Agradecería si pudieras elaborar :) – Mathieu

+0

@Tigel: Esto es básicamente lo mismo que la opción de Elad se enumeran a continuación. Solo estaba recomendando dejar solo tu singleton, pero tener una propiedad bajo tu control (no estática) que devuelve el singleton. –

+0

Bien problema resuelto. ¡Gracias por su ayuda caballeros! @Vladimir Dorokhov @Reed Copsey @Elad Katz – Mathieu

4

Se podría aplicar el singleton ligeramente de manera diferente, así:

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

por lo que ahora podría hacer lo siguiente en XAML:

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

y se unen de esta manera:

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

observe que el singleton todavía es un si ngleton, pero simplemente eludimos la estática faltante de Silverlight al no configurar el captador como estático.

+0

Tendré que esperar hasta mañana para probar esto, pero parece una buena solución. Sin embargo, ¿se considera una buena práctica no tener un getter estático en un miembro estático? ¿Cuál es la consecuencia de no tener el getter estático? – Mathieu

+0

no demasiado ... se usa con mucha frecuencia cuando se implementa MVVM en Silverlight, en el patrón ViewModelLocator que fue diseñado por laurent Bugnion (mvvmlight). Es ampliamente aceptado. –

+0

Recordé que en algunos lugares de mi código necesito acceder a mi singleton a través de una llamada "MyClass.Instance.SomeMethod". Esto no será posible si el captador no es estático. – Mathieu

8

consejo que añadir a clase adicional MyClassProvider:

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

instancia de esta clase se puede colocar en cualquier lugar y se unen a su propiedad MyClass.

3

He verificado el siguiente está trabajando en Silverlight 5:

Mantenga su clase MyClass sin cambios, a continuación, crear una propiedad de MyClass con el nombre de MyClass en su clase de control de usuario de negocios:

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

Entonces en su negocio de control de usuario XAML, no vinculante como esto:

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

Una vez en algún lugar en su aplicación, MyClass.Instance.MyProperty (aquí MyClass es el nombre de la clase) cambia el valor de MyProperty, se actualizará el enlace anterior.

+0

Esto también debería funcionar en Silverlight 4 y WP7.1. –

Cuestiones relacionadas