2011-02-25 9 views
4

は、私は次のXAMLいる:結合に使用MVVM /のObservableCollection質問

<Grid x:Name="LayoutRoot"> 
     <sdk:DataGrid AutoGenerateColumns="True" Margin="46,38,0,40" x:Name="FamilyListGrid" HorizontalAlignment="Left" Width="475" 
       ItemsSource="{Binding FamilyList}" 
       SelectedItem="{Binding SelectedFamily, Mode=TwoWay}" /> 
    </Grid> 

マイFamilyListプロパティは、私の見解モデルクラス内のエンティティののObservableCollectionです。私は私のFamilyListコレクションのセッターでINotifyPropertyChangedを実装する必要があることがわかっています。バインディングは機能しません。 ObservableCollectionが既にこれを実装していることは私の理解であった。このような場合は、なぜnotifyプロパティを実装する必要がありますか?

それが助け場合は、ここに私のFamilyListプロパティの定義です:

private ObservableCollection<Services.Family> familyList; 
    public ObservableCollection<Services.Family> FamilyList 
    { 
     get { return familyList; } 
     private set 
     { 
      familyList = value; 
      NotifyPropertyChanged("FamilyList"); 
     } 
    } 

答えて

6

ObservableCollection<T>は、コレクションの変更(項目の並べ替え、削除、追加)について登録されているイベントハンドラを通知するINotifyCollectionChangedを実装しています。ただし、DataGridは、グリッド内の値を更新するためにビジネスオブジェクトの1つのプロパティが変更されているかどうかを知る必要があります。このためにはINotifyPropertyChangedが必要です。また、INotifyCollectionChangedを実装します。ただし、これは、コレクションのプロパティが変更された場合にのみ通知するために使用できます。あなたのビジネスオブジェクトが変更された場合にコレクションが検出できるようにするメカニズムはありません(もしあれば、ビジネスオブジェクトのINotifyCollectionChangedに登録されます:)。

2

ObservableCollectionは、コレクションが変更されたかどうか、つまりアイテムが追加または削除されたかどうかを通知する方法を知っています。

しかし、あなたは次の操作を実行した場合:その後、あなたが実際に異なっているあなたのコレクションを、保持しているプロパティを変更している

FamilyList = new ObservableCollection<FamilyList>(); 
// or 
FamilyList = GetFamilyList(); 

。私はこれがここの問題だと思っています。

0

observableコレクションのインスタンスではなく、observableコレクションのインスタンスを変更しています。コレクションには通知するものは何もありません。

1

ObservableCollectionのINotifyPropertyChangedの実装は、基本的に、そのコレクションへの追加または削除に反応するために使用されます。

Notify ...()を呼び出さない限り、コレクションはViewModelのプロパティであり、DataGridはViewModelのプロパティの変更に反応しないため、セッターでNotify ...()を呼び出す必要があります。変更されたとき。

編集: 私は遅すぎます。

0

コレクション自体がアイテムを追加または削除するかどうかを通知する必要はありません。ただし、新しい/異なるインスタンス(つまりfamilyList = new ObservableCollection<Services.Family>())でコレクション全体を交換する場合は、通知する必要があります。実際にインスタンスを変更している場合は、代わりにコレクションの消去/再投入を検討してください。

1

リストをバインドする前にコレクションを保持するプロパティが作成されていれば、/ DataContextが設定されている必要があります。 @Phil Sandlerが述べているように、コレクションが置き換えられた場合は、通知する必要があります。変数を宣言するときにnewだけを作成したり、クラスのコンストラクタ内にnewを実行したりする場合は、の通知プロパティを変更する必要はありません。プロパティ。リストを消去する必要がある場合は、コレクションのClearメソッドを使用し、置き換えないことをお勧めします。

関連する問題