wpf - onpropertychanged - propertychangedeventargs
¿Cómo se logra la funcionalidad INotifyPropertyChanged para los valores en un bool[]? (3)
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 una propiedad de una clase:
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 celda 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 el evento de notificación se genera solo cuando cambio la matriz en sí y no se genera cuando cambio un valor dentro de la matriz, es decir, la próxima línea de código plantea el evento:
Statuses = new bool[4];
pero la siguiente línea no plantea el evento:
Statuses [0] = true;
¿Cómo puedo plantear el evento cada vez que se cambia una celda?
No plantea el evento porque Array
no implementa INotifyPropertyChanged
. Puede usar un contenedor diferente de la matriz primitiva (todo lo que implemente INotifyCollectionChanged
le INotifyCollectionChanged
ObservableCollection<T>
) o debe llamar a RaisePropertyChanged("Statuses")
cada vez que actualice la matriz de estados O, como se menciona en otra respuesta, use una clase que implemente INotifyPropertyChanged
que contenga 4 propiedades.
No puedes hacerlo mientras usas una Array
. Cambiar un valor en cualquier índice de una Array
no Array
una notificación de cambio requerida por la UI
.
¿Puedes usar una clase con cuatro propiedades que implemente la interfaz INotifyPropertyChanged
?
Necesita exponer sus estados como un indexador, 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 publicación en el blog:
http://10rem.net/blog/2010/03/08/wpf---silverlight-quick-tip-inotifypropertychanged-for-indexer