2011-06-17 15 views
6

La aplicación está desarrollada con C# y WPF. Tengo un enlace de datos a una propiedad estática de una clase no estática. Cuando se inicia la aplicación, el enlace funciona bien, pero si cambio el bool del enlace, la vista no se actualiza. ¿Cómo puedo actualizar el enlace de esta propiedad estática? NotifyChanged-Events no se ven afectados.Actualización del enlace de la propiedad estática

La clase:

public class ViewTemplateManager : NotifyBase 
{ 
    public static bool CanResizeColumns { get; set; } 

    static ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 

La Vista:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static Member=viewManager:ViewTemplateManager.CanResizeColumns}}" 
+0

No entiendo por qué esta clase es estática. Puede usar herencia o composibilidad para combinar esto con una clase base de su modelo de vista. Si lo hace, tendrá CanResizeColumns como propiedad en su viewmodel y usará con éxito OnPropertyChanged ("PropertyName")? –

Respuesta

6

La única manera de hacerlo es si tiene una referencia al BindingExpression asociado.

Asumiendo que tiene una referencia al pulgar en su código, que se vería así:

var bindingExpression = thumb.GetBindingExpression(Thumb.IsEnabledProperty); 
if (bindingExpression != null) 
    bindingExpression.UpdateTarget(); 

Su mejor opción sería utilizar un patrón Singleton, así:

public class ViewTemplateManager : NotifyBase 
{ 
    public bool CanResizeColumns { get; set; } 

    public static ViewTemplateManager Instance { get; private set; } 

    static ViewTemplateManager() 
    { 
     Instance = new ViewTemplateManager(); 
    } 

    private ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 
} 

Entonces se unen de este modo:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static viewManager:ViewTemplateManager.Instance}, Path=CanResizeColumns}}" 

Luego sólo hay que provocar el evento cuando yo INotifyPropertyChanged.PropertyChanged Cambia CanResizeColumns.

+0

¡Funciona bien con Singleton Pattern! – Gepro

2

Por desgracia, no hay un equivalente directo al mecanismo de notificación de INotifyPropertyChanged una propiedad estática.

Hay un par de opciones, incluyendo:

  1. Hacer una propiedad de nivel de instancia que devuelve el miembro estático. Use un mecanismo personalizado para notificar las instancias del cambio, en cuyo momento la instancia puede generar el evento PropertyChanged. Esto puede ponerse feo e introducir pérdidas de memoria si no tiene cuidado con la cancelación de suscripción o el uso de un patrón de Evento Débil.
  2. Mueva la propiedad estática a un singleton y colóquela como un miembro de instancia en la instancia singleton. Esto permite que la instancia genere eventos PropertyChanged de forma normal.
+0

Hay 'StaticPropertyChanged' – Wobbles

+0

@wobbles se agregó después de esta respuesta –

2

Usted puede poner en práctica las inmueble con Singleton en el que la propiedad no es estático o simplemente también hacen que sea no estático, sino que acaba de crear una instancia en la instancia App por ejemplo (i iría con este último) En cualquier caso, puede implementar INotifyPropertyChanged nuevamente.

0

creo que es la solución más fácil: la propiedad

Clase:

private static bool isEnabled; //there is Your static 

public bool IsEnabled 
{ 
    get { return isEnabled; } 
    set 
    { 
     isEnabled = value; 
     RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something 
    } 
} 

XAML:

<Button IsEnabled="{Binding IsEnabled}"/> 
Cuestiones relacionadas