2011-01-05 4 views
10

私はサイズが4のブール配列を持ち、各セルを別のコントロールにバインドしたいと考えています。 このbool配列は4つのステータスを表します(false =失敗、true =成功)。bool []内の値に対してINotifyPropertyChanged機能を実現するにはどうすればよいですか?

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

XAMLで各アレイの一つのセルに結合し、4つのコントロールがあります: このブール配列は、クラスとproperyは

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

問題は、イベントが通知することです私は配列自体を変更する場合にのみ上昇し、私は、配列内の値を変更するときに発生されていない、すなわち、次のコード行は、イベントが発生します。

Statuses = new bool[4]; 

が、次の行にも上げていませんt:

Statuses [0] = true; 

1つのセルが変更されるたびにイベントを発生させるにはどうすればよいですか?

答えて

3

Array自体がINotifyPropertyChangedを実装していないため、イベントが発生しません。プリミティブ配列(INotifyCollectionChangedにはObservableCollection<T>のようなものが実装されているもの)と異なるコンテナを使用することもできます。また、Statuses配列を更新するたびにRaisePropertyChanged("Statuses")を呼び出す必要があります。また、INotifyPropertyChangedを実装するクラス4プロパティ。

+0

はい、のObservableCollectionを使用して行くための最も簡単な方法となります。 –

+0

'ObservableCollection 'は、内部の項目の値が変更されたときに通知しません。 – decyclone

+0

@decyclone:コレクションのn番目のアイテムが移動、置換などされているかどうかを通知します。これはOPのコードと同じです。 Tがプロパティを持ち、INotifyPropertyChangedを実装していないケースを処理できないという点で正しいですが、質問の範囲外であると考えました。 –

1

Arrayを使用している間は実行できません。 Arrayの任意のインデックスの値を変更しても、UIに必要な変更通知は発行されません。

代わりにINotifyPropertyChangedインターフェイスを実装する4つのプロパティを持つクラスを使用できますか?

8

ステータスをインデクサーとして公開し、次にインデクサーが変更されたことを示すプロパティ変更イベントを発生させる必要があります。

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

このブログ記事を参照してください。

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

+0

プロパティ変更イベントを発生させたときにかっこが見つかりませんでした。 – Marshall777

+0

@ Marshall777 thanks - それを修正しました:-) – ColinE