2011-01-05 8 views
10

Mam tablicę bool wielkości 4 i chcę powiązać każdą komórkę z inną formant. Ta tablica bool reprezentuje 4 statusy (false = failure, true = success). Tablica BOOL jest propery z klasy:Jak uzyskać funkcjonalność INotifyPropertyChanged dla wartości w bool []?

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

w XAML są 4 sterujące, z których każdy wiąże się z jednej komórki do tablicy:

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

Problemem jest to, że powiadamia zdarzenie jest podniesiony tylko kiedy się zmienić tablicy i nie jest podniesione kiedy zmienić jedną wartość w tablicy, czyli następny wiersz kodu podnosi wydarzenie:

Statuses = new bool[4]; 

ale następna linia nie podnosi nawet t:

Statuses [0] = true; 

Jak podnieść wydarzenie za każdym razem, gdy jedna komórka zostanie zmieniona?

Odpowiedz

3

Nie powoduje to zdarzenia, ponieważ samo Array nie implementuje INotifyPropertyChanged. Możesz użyć innego kontenera niż prymitywna tablica (wszystko, co powinno zaimplementować INotifyCollectionChanged lubił ObservableCollection<T>) LUB musisz zadzwonić pod numer RaisePropertyChanged("Statuses") za każdym razem, gdy aktualizujesz tablicę statusów OR, jak jest to określone w innej odpowiedzi, użyj jednej klasy, która implementuje INotifyPropertyChanged, która zawiera 4 właściwości.

+0

Tak, przy użyciu ObservableCollection będzie najprostsza droga. –

+0

'ObservableCollection ' nie powiadamia o zmianie wartości dowolnego elementu wewnątrz niego. – decyclone

+0

@decyclone: ​​informuje, czy n-ty element kolekcji został przeniesiony, wymieniony itp., Co jest tym, co robi kod OP. Masz rację, ponieważ nie poradzi sobie z przypadkiem, w którym T ma właściwości i nie implementuje INotifyPropertyChanged, ale uznałem, że wykracza to poza zakres pytania. –

1

Nie można tego zrobić podczas korzystania z Array. Zmiana wartości dowolnego indeksu na Array nie powoduje powiadomienia o zmianie wymaganego przez UI.

Czy można użyć klasy z czterema właściwościami, która implementuje interfejs INotifyPropertyChanged?

8

Musisz wystawić swoje statusy jako indeksator, a następnie wywołać zdarzenie zmiany właściwości, które wskazuje, że indekser się zmienił.

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

Zobacz ten wpis na blogu:

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

+0

Brakowało Ci nawiasu, gdy podnosisz zdarzenie zmienione właściwości. – Marshall777

+0

@ Marshall777 dzięki - naprawiono :-) – ColinE

Powiązane problemy