2009-04-28 14 views
3

ListViewを使用して、アプリケーションで発生したエラーのリストを表示します。 Visual Studioのエラーリストと同じように動作し、表示されます。最後のエラー項目が選択されたときに自動スクロールを追加します(最後にキャレットを配置するときにVisual Studioのログウィンドウが自動的にスクロールする方法など)。私は_Items_CollectionChangedイベントハンドラで自動スクロールを実行しようとしたが、これは上のイベントですのでリストビューを最後に追加したアイテムに自動的にスクロールする最適な方法は何ですか?

public ObservableCollection<ErrorListItem> Items; 
... 
MyListView.ItemsSource = _Items; 

エラーのリストは、このようなListView.ItemsSourceに渡されObservableCollection、ですItemsSourceで、実際のListViewItemsではなく、最後の項目が選択されているかどうかを確認したり、新しい行などを選択したりするのは苦労です。ListViewItemsは即座に作成されないようですので特に難しいです。

void _Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    // determine the last item to select from 'e' 
    ...   

    _ItemPendingToBeScrolled = newItemToSelect; 
    ListView.SelectedItem = newItemToSelect; 


    Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     (ThreadStart)delegate 
     { 
      if (_ItemPendingToBeScrolled != null) 
      { 
       ListView.ScrollIntoView(_ItemPendingToBeScrolled); 
       ItemPendingToBeScrolled = null; 
      } 
     }) 
} 

しかし、それは明らかにそれを行うには正しい方法ではない:私はこのように最後に選択した項目を設定するための呼び出しを遅らせることによってそれ自動スクロールさせることができました。また、リストがフィルタリングされている(私のソースの最後の項目をチェックしていないが、ListViewの最後のListViewItemをチェックしていれば、作業を続行したい)。

ListViewItemがバインドされたコレクションに追加された後にListViewに追加されると、イベントを聴く方法はありますか?それは私のオートスクロールを適切に行うためにキャプチャする理想的なイベントです。それとも、私が使うことのできる別のテクニックがありますか?

答えて

0

リストボックス/リストビューとそのスクロールに関する問題がたくさんありますが、リストビューの変更されたイベントにフックすると述べましたが、これは観測可能なコレクションのCollectionChangedイベントを聞くことができないためですか? ObservableCollectionはListコントロールよりも安定しており、同じ通知が得られます。

UIで動作していなくてもアクセスできない場合は、これらのイベントをバブルすることもできます。この方法では、実際のコレクションにアクセスすることなくUIでスクロールを処理します。カスタムEventArgsクラスのアイテム