2011-01-05 5 views
10

Ho una matrice bool di dimensione 4 e voglio associare ogni cella a un controllo diverso. Questo array bool rappresenta 4 stati (false = failure, true = success). Questo array booleano è un propery con una classe:Come ottenere la funzionalità INotifyPropertyChanged per i valori in un valore bool []?

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

In XAML ci sono 4 controlli, ciascuno legato ad una cella della matrice:

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

Il problema è che la notifica evento è sollevato soltanto quando cambio la matrice stessa e non viene generato quando cambio un valore all'interno della matrice, cioè, riga successiva codice genera l'evento:

Statuses = new bool[4]; 

ma riga successiva non solleva l'ancora t:

Statuses [0] = true; 

Come posso aumentare l'evento ogni volta che si cambia una cella?

risposta

3

Non solleva l'evento perché lo stesso Array non implementa INotifyPropertyChanged. È possibile utilizzare un contenitore diverso rispetto all'array primitivo (tutto ciò che implementa INotifyCollectionChanged piaciuto ObservableCollection<T> dovrebbe essere necessario) O è necessario chiamare RaisePropertyChanged("Statuses") ogni volta che si aggiorna l'array Statuses OPPURE, come indicato in un'altra risposta, utilizzare una classe che implementa INotifyPropertyChanged che contiene 4 proprietà.

+0

Sì, utilizzando ObservableCollection sarà il modo più semplice per andare. –

+0

'ObservableCollection ' non notifica quando viene modificato un valore di qualsiasi elemento al suo interno. – decyclone

+0

@decyclone: ​​notifica se l'ennesimo elemento della raccolta viene spostato, sostituito, ecc., Che è ciò che fa il codice dell'OP. Hai ragione nel senso che questo non gestirà il caso in cui T ha proprietà e non implementa INotifyPropertyChanged, ma l'ho considerato al di fuori della portata della domanda. –

1

Non è possibile farlo mentre si utilizza un Array. La modifica di un valore in qualsiasi indice su un numero Array non aumenta la notifica di modifica richiesta dallo UI.

È possibile utilizzare una classe con quattro proprietà che implementa l'interfaccia INotifyPropertyChanged?

8

È necessario esporre i propri stati come indicizzatori, quindi generare un evento di modifica proprietà che indica che l'indicizzatore è stato modificato.

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)); 
    } 
} 

Vedi questo post del blog:

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

+0

Hai perso una parentesi quando aumenti l'evento modificato proprietà. – Marshall777

+0

@ Marshall777 grazie - risolto :-) – ColinE