2011-08-01 15 views
0

私はWPF MVVMアプリケーションで作業しています。自分のデータグリッドにバインドされているコレクションが変更されたときに、何らかのイベントが発生する必要があります。データソースの変更時にWPF DataGridでイベントを発生させよう

例: - 私のデータグリッドアイテムの源は私がのUserListコレクションをクリアしたときに、データグリッド上のいくつかのイベントが発生自体を通知したいのObservableCollectionのUserList

です。私はDataGridのこのイベントDataContextChangedを試しましたが、それは役に立たなかった。あなたはUIイベントを処理する必要はありませんMVVMパターンに従っている場合

おかげ

+0

アイテムソース設定の背後にあるコードの代わりにバインディングを使用します。 – Rumplin

答えて

1

を案内してください。オブジェクトのコレクションはViewModelの一部です。したがって、コレクションの変更時に発生するViewModelにPropertyChangedイベントを追加する必要があります。

+0

はい、そうです。何らかの理由でGUIにそのイベントを処理したいのですが、とにかく私はこれを行うことができますか?DataGridのソースが変更されたときに通知を受けました。 –

0

あなたはMVVMを使用している場合は、あなたがこの

 /// <summary> 
    /// The <see cref="UserList" /> property's name. 
    /// </summary> 
    public const string UserListPropertyName = "UserList"; 
    private ObservableCollection<UserList> _userList = new ObservableCollection<UserList>(); 
    public ObservableCollection<UserList> UserList 
    { 
     get 
     { 
      return _userList; 
     } 
     set 
     { 
      if (_userList != value) 
      { 
       _userList = value; 
       RaisePropertyChanged(UserListPropertyName); 
      } 
     } 
    } 

のような性質を持っており、セッターの一部にあなたが背後にあるコードを使用している場合は、あなたではない、ビューモデル内の任意のメソッドを呼び出すことができますMVVMパターンを使用する

0

コレクションへの参照が変更されたときにイベントが発生するようにするには、Rumplinが実演したときにViewModelでOnPropertyChangedイベントを使用する必要があります。ただし、コレクションにユーザーが追加されたりコレクションから削除されたときを知りたい場合は、ObservableCollectionでCollectionChangedイベントのハンドラーを追加する必要があります。

0

あなたが探しているイベントはCollectionChangedです。

あなたと(同じことをやろうとしている)あなたにとって混乱の原因は、コレクションが変更されたときにデータグリッドのソースが変更されたと考えていることです。そうではありません。データグリッドのItemsSourceは依然としてコレクションです。これを別のコレクションに割り当てていないか、またはクリアしていません。したがってPropertyChangedDataContextChangedは呼び出されておらず、それらを処理しても効果はありません。

CollectionChangedは、多くのことがコレクションの変更を構成するため、かなり適切です。したがって、正しく処理するにはかなり徹底的に理解する必要があります。私はあなたが本当にそれを扱う必要はないと思っています - あなたは、縛りによってより良いことができる出来事で何かをしようとしています。

+0

しかし、このイベントはビューモデルで発生します。実際にはグリッドは私のextndedユーザーコントロールです。このイベントをユーザーコントロール側で処理したいと思います。例: - コレクションが変更されたときにインデックスを0に設定するか、コレクションにレコードがない場合、cansortカラムをfalseなどに設定します。 –

+0

これらはすべてバインディングを介して行うことができます。 –