3

ListViewアプリケーションで発生したエラーのリストを表示するためにを使用します。Visual Studioのエラーリストとまったく同じように動作し、表示されます。最後のエラー項目が選択されたときに自動スクロールを追加したい(最後にキャレットを配置したときにVisual Studioのログウィンドウが自動スクロールする方法など)。

エラーのリストはにあり、次のようObservableCollectionに渡されます。ListView.ItemsSource

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

_Items_CollectionChangedイベントハンドラーで自動スクロールを実行してみましたが、これは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;
            } 
        })
}

しかし、それは明らかにそれを行う正しい方法ではありません。また、リストがフィルタリングされている場合でも機能し続けたいと思います(ソースの最後の項目ではなく、の最後の項目をチェックしますListViewItemListView

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

4

1 に答える 1

0

リストボックス/リストビューとそのスクロールには多くの問題がありますが、リストビューの変更イベントへのフックについて言及しましたが、それは監視可能なコレクションの CollectionChanged イベントをリッスンできないためですか? ObservableCollection は List コントロールよりもはるかに安定しており、同じ通知を受け取ることができます。

UI で機能せず、アクセスできない場合は、これらのイベントをバブルアップすることもできます。このようにして、実際のコレクションにアクセスせずに UI でスクロールを処理し、カスタムで選択したアイテムへの参照を保持するだけです。 EventArgs クラス

于 2011-09-14T04:12:36.963 に答える