2012-03-20 30 views
6

Tenía una variable que no era estática e INotifyPropertyChanged se implementó con éxito. Luego traté de hacerlo global, así que lo convertí en una variable estática. Pero esta vez, INotifyPropertyChanged no funciona. ¿Alguna solución?INotifyPropertyChanged para la variable estática

+0

posible duplicado de [Encuadernación a la propiedad estática] (http://stackoverflow.com/questions/936304/binding-to-static-property) –

Respuesta

21

INotifyPropertyChanged funciona en propiedades de instancia. Una solución es usar un patrón singleton y mantener INotifyPropertyChanged, la otra es usar su propio evento para notificar a los oyentes.

Singleton ejemplo

public sealed class MyClass: INotifyPropertyChanged 
{ 
    private static readonly MyClass instance = new MyClass(); 
    private MyClass() {} 

    public static MyClass Instance 
    { 
     get 
     { 
     return instance; 
     } 
    } 

    // notifying property 
    private string privMyProp; 
    public string MyProp 
    { 
     get { return this.privMyProp; } 

     set 
     { 
      if (value != this.privMyProp) 
      { 
       this.privMyProp = value; 
       NotifyPropertyChanged("MyProp"); 
      } 
     } 
    } 


    // INotifyPropertyChanged implementation 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

EDITAR: En WPF 4.5, introdujeron propiedad cambió mecánico de las propiedades estáticas:

puede utilizar las propiedades estáticas como la fuente de un enlace de datos. El motor de enlace de datos reconoce cuándo cambia el valor de la propiedad si se produce un evento estático . Por ejemplo, si la clase SomeClass define una propiedad estática llamada MyProperty, SomeClass puede definir un evento estático que se genera cuando cambia el valor de MyProperty. El evento estático puede usar cualquiera de las siguientes firmas.

public static event EventHandler MyPropertyChanged; 
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 
+3

+1 para sugerencia singleton –

+0

¿Un pequeño ejemplo? – Shibli

+0

@Shilbi ¿Un pequeño ejemplo de qué? – chopikadze

5

muy buen ejemplo, que la utilizó para algunos ajustes generales de aplicación, cuando quiero obligar a alguna propiedad en línea a los componentes

public sealed class DataGridClass:INotifyPropertyChanged 
{ 
     private static readonly DataGridClass instance = new DataGridClass(); 
     private DataGridClass() { } 

     public static DataGridClass Instance 
     { 
      get 
      { 
      return instance; 
      } 
     } 

    private int _DataGridFontSize {get;set;} 

    public int DataGridFontSize 
    { 
     get { return _DataGridFontSize; } 
     set { _DataGridFontSize = value; 
      RaisePropertyChanged("DataGridFontSize"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

Establecer propiedades de inicio:

DataGridClass.Instance.DataGridFontSize = 14(or read from xml) 

Enlace esto a propiedades de componentes

xmlns:static="clr-namespace:MyProject.Static" 
<extgrid:ExtendedDataGrid x:Name="testGrid" ClipboardCopyMode="IncludeHeader" AutoGenerateColumns="False"> 
<extgrid:ExtendedDataGrid.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="FontSize" 
     Value="{Binding Source={x:Static static:DataGridClass.Instance}, 
     Path=DataGridFontSize, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 
    </Style> 
</extgrid:ExtendedDataGrid.Resources> 

Cuando se cambia este valor en algún lugar de aplicación como "Preferencias" -> DataGrid Tamaño de Letra - a una actualización automática esta propiedad para los enlaces con UpdateSourceTrigger

private void comboBoxFontSize_DropDownClosed(object sender, EventArgs e) 
    { 
     DataGridClass.Instance.DataGridFontSize = Convert.ToInt32(comboBoxFontSize.Text); 
    } 


    <ComboBox Grid.Column="1" Grid.Row="0" Height="21" Width="75" Name="comboBoxFontSize" HorizontalAlignment="Left" 
           VerticalAlignment="Center" DropDownClosed="comboBoxFontSize_DropDownClosed" 
           ItemsSource="{Binding Source={x:Static commands:ConstClass.ListOfFontSize},Mode=OneWay}" 
           SelectedItem="{Binding Source={x:Static static:DataGridClass.Instance},Path=DataGridFontSize, 
         Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 
+0

Muchas gracias por este ejemplo, es exactamente lo que necesitaba. ¡Funciona un regalo! – RobHurd

Cuestiones relacionadas