2011-01-05 17 views
10

4 boyutunda bir bool dizim var ve her hücreyi farklı bir denetime bağlamak istiyorum. Bu bool dizisi 4 durumu temsil eder (false = failure, true = success).INolifyPropertyColged işlevler bir bool []?

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

XAML, her biri dizinin bir hücreye bağlanmış, 4 denetimleri vardır: Bu BOOL dizisi bir sınıf ile bir emlak olan

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

sorun olaydır bildirmek olmasıdır

Statuses = new bool[4]; 

ama sonraki satır bile yükseltir vermez: Ben dizinin kendisi değiştirebilir ve ben dizinin içinde bir değeri değiştirdiğinizde kaldırdı değilken sadece yükseltilmiş, yani bir sonraki kod satırı olay yükseltir t:

Statuses [0] = true; 

Her hücre değiştiğinde olayı nasıl artırabilirim?

cevap

3

Bu olaykendi başına INotifyPropertyChanged uygulamıyor. İlkel diziden farklı bir kapsayıcı kullanabilirsiniz (INotifyCollectionChanged öğesinin uygulandığı her şey ObservableCollection<T> öğesinin yapmasını gerektirir) VEYA Statüs dizisini her güncelleştirdiğinizde VEYA başka bir yanıtta metriklendiğinde RaisePropertyChanged("Statuses") numaralı telefonu çağırmanız gerekirse, INotifyPropertyChanged'u içeren bir sınıf kullanın. 4 özellik.

+0

Evet, ObservableCollection kullanarak gitmek en kolay yolu olacaktır. –

+0

'ObservableCollection ', içindeki herhangi bir öğenin değeri değiştirildiğinde bildirimde bulunmamaktadır. – decyclone

+0

@decyclone: ​​koleksiyonun nth öğesinin taşındığını, değiştirildiğini, OP'nin kodunun yaptığı gibi bildirir. Bunun T'nin özelliklere sahip olduğu ve INotifyPropertyChanged uygulanmadığı durumla başa çıkmayacağından, ancak sorunun kapsamı dışında olduğunu düşündüğümden emin olabilirsiniz. –

1

Array kullanırken bunu yapamazsınız. Array'daki herhangi bir dizindeki bir değerin değiştirilmesi, UI tarafından istenen değişiklik bildirimini artırmaz.

Yerine INotifyPropertyChanged arabirimini uygulayan dört özellikli bir sınıf kullanabilir misiniz?

8

Durumunuzu bir dizinleyici olarak göstermeniz, ardından dizinleyicinin değiştiğini belirten bir özellik değişikliği olayı oluşturmanız gerekir.

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

bu blog yazısı bakınız:

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

+0

Mülkiyet değiştirilen etkinliği artırdığınızda parantez kaçırdınız. – Marshall777

+0

@ Marshall777 teşekkürler - düzeltildi :-) – ColinE