2011-01-05 8 views
10

Tengo una matriz bool de tamaño 4 y quiero vincular cada celda a un control diferente. Esta matriz bool representa 4 estados (falso = error, verdadero = éxito). Esta matriz bool es un Propery con una clase:Cómo lograr la funcionalidad INotifyPropertyChanged para los valores en un bool []?

class foo : INotifyPropertyChanged { 
... 
private bool[] _Statuses; 
public bool[] Statuses 
{ 
    get {return Statuses;} 
    set { 
      Statuses = value; 
      OnPropertyChanged("Statuses"); 
     } 
} 

En XAML hay 4 controles, cada uno unido a una célula de la matriz:

... Text="{Binding Path=Statuses[0]}" ... 
... Text="{Binding Path=Statuses[1]}" ... 
... Text="{Binding Path=Statuses[2]}" ... 
... Text="{Binding Path=Statuses[3]}" ... 

El problema es que la notificación de eventos es planteado solamente cuando cambio la matriz en sí y no se eleva cuando cambio un valor dentro de la matriz, es decir, la próxima línea de código genera el evento:

Statuses = new bool[4]; 

pero la próxima línea no plantea la incluso t:

Statuses [0] = true; 

¿Cómo puedo plantear el evento cada vez que se cambia una celda?

Respuesta

3

No plantea el evento porque Array no implementa INotifyPropertyChanged. Puede usar un contenedor diferente al primitivo (todo lo que implementa INotifyCollectionChanged gustado ObservableCollection<T> debe hacerlo) O debe llamar al RaisePropertyChanged("Statuses") cada vez que actualiza la matriz de estados O, como se menciona en otra respuesta, use una clase que implemente INotifyPropertyChanged que contenga 4 propiedades.

+0

Sí, utilizando ObservableCollection será la forma más sencilla de ir. –

+0

'ObservableCollection ' no notifica cuando se cambia un valor de cualquier elemento dentro de él. – decyclone

+0

@decyclone: ​​notifica si el n-ésimo elemento de la colección se mueve, reemplaza, etc., que es lo que hace el código del OP. Tiene razón en que esto no manejará el caso en el que T tiene propiedades y no implementa INotifyPropertyChanged, pero lo consideré fuera del alcance de la pregunta. –

1

No puede hacerlo mientras usa un Array. El cambio de un valor en cualquier índice en un Array no genera una notificación de cambio requerida por el UI.

¿Se puede utilizar una clase con cuatro propiedades que implemente la interfaz INotifyPropertyChanged?

8

Necesita exponer sus estados como indizador y luego generar un evento de cambio de propiedad que indique que el indexador ha cambiado.

private bool[] _Statuses; 

public bool this[int index] 
{ 
    get { return _Statuses[index]; } 
    set 
    { 
     _Statuses[index] = value; 

     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(Binding.IndexerName)); 
    } 
} 

Ver esta entrada del blog:

http://10rem.net/blog/2010/03/08/wpf---silverlight-quick-tip-inotifypropertychanged-for-indexer

+0

Se perdió un paréntesis cuando levanta el evento de propiedad cambiada. – Marshall777

+0

@ Marshall777 gracias - lo arregló :-) – ColinE

Cuestiones relacionadas