7

ListViewはにデータバインドされているを持っていObservableCollectionます...

<ListView x:Name="List1" ItemsSource="{Binding MyList}" />

コレクションが変更されたときにトリガーされるイベントが見つからないようです。どういうわけか、collectionchanged通知にフックする必要があると思いますか?どうすればいいのかよくわかりません。

基本的に、コレクションが変更された場合、ListViewがリストを更新する際にすでに行っていること以外の追加の作業を行いたいと思います。

4

3 に答える 3

26

デフォルトでItemsSourceは、はタイプIEnumerableです。最初にイベントにアクセスできるタイプにキャストしてから、CollectionChangedそのイベントのハンドラーを追加する必要があります。

((INotifyCollectionChanged)List1.ItemsSource).CollectionChanged +=
    new NotifyCollectionChangedEventHandler(List1CollectionChanged);

public void List1CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
{
    // Your logic here
}


注:INotifyCollectionChanged私の例ではにキャストしましたが、実際にはそれを実装する任意のオブジェクトにキャストできます。ただし、ベストプラクティスとして、必要なメソッド/プロパティ/イベントにアクセスできる最も一般的なタイプにキャストする必要があります。したがって、にキャストすることはできObservableCollectionますが、キャストする必要はありません。INotifyCollectionChanged必要なイベントが含まれており、それを実装する他のタイプのコレクションを使用することにした場合でも、これは引き続き機能します。一方、キャストすると、ある日、リストがこれよりもObservableCollectionタイプになっていると判断した場合に、MyOwnTypeOfObservableCollectionNotDerivedFromObservableCollection壊す。;)

PSこれはxamlコードビハインドに含める必要があります。

于 2011-04-27T15:15:05.227 に答える
0

ハンドラーをリストに添付する必要があります。または、を使用してCollectionView、変更されたイベントをそこでフックします。

コードビハインドで、次のようにします。

MyList.CollectionChanged += new NotifyCollectionChangedEventHandler( this.MyCollectionChanged );


private void SortCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
  Debug.WriteLine( "Changed" );
}
于 2011-04-27T15:01:48.203 に答える
0

ObservableCollection {T}は、INotifyCollectionChanged.CollectionChangedイベントを公開します。ItemsSourceにバインドする場合、データバインディングエンジンはソースからアイテムコントロールへの変更の伝播を処理しますが、追加の処理を実行する必要がある場合は、ハンドラーをCollectionChangedイベントにアタッチし、それが提供するNotifyCollectionChangedEventArgsを使用できます。

MyListという名前のビューモデルにパブリックプロパティがあると仮定します。

public ObservableCollection<T> MyList
{
  get
  {
    if(_viewModelMyList == null)
    {
      _viewModelMyList = new ObservableCollection<T>;
      _viewModelMyList.CollectionChanged += (o, e) => 
      {
        // code to process change event can go here
        if(e.Action == NotifyCollectionChangedAction.Add)
        {
        }
      };
    }
    return _viewModelMyList;
  }
}
private ObservableCollection<T> _viewModelMyList;
于 2011-04-27T15:04:33.363 に答える