2009-07-06 11 views
2

WPFリストビューの基になるコレクションが変更されたときにスクロールバーのサイズを正しく変更する方法は?WPFリストビューの基になるコレクションが変更されたときにスクロールバーのサイズを正しく変更する方法はありますか?

私はWPF ListViewを数千のアイテムを持つ観測可能なコレクションにバインドしています。それらの多数が削除されると、ビューは最後の項目のみを表示するように見えます。サムバーバーでビューの位置を移動すると、新しいコレクションサイズを反映するようにサムバーのサイズが変更されます。コレクションが変更されたときにListViewとスクロールバーを同期させることは可能ですか?

答えて

2

誰かがこの問題を抱えている場合、回避策を見つけました。

次のコード例は、最初の行で変更されたリストビューのアイテムソースを示しています。次の行は、最初の項目にスクロールするための回避策を示しています。

this.ListViewResults.ItemsSource = this.itemsFiltered; 

object firstItem = this.ListViewResults.Items.GetItemAt(0); 

if(firstItem == null) 
{ 
    return; 
} 

this.ListViewResults.ScrollIntoView(firstItem); 
+0

これは完全に機能します!データソース/ itemssourceを設定し、最初の行を見つけてスクロールしてください! –

+0

同じ問題がありましたか?私は他の人がこれを見ていた多くの例を見つけることができませんでした。 –

0

奇妙な動作!

バインディングをリフレッシュするために、リストビューのバインディングコンテキスト(コンテキスト)をnullに設定してから同じリストを再度設定しようとします。

+0

いいえ、それは動作していないようです。 'MyListView.DataContext'を' null'と空のデータセットの両方に設定しようとしました。 –

0

私はリストビューをサブクラス化する必要がある別の回避策があります。もう少し作業は必要ですが、結果は最初の項目にスクロールするだけではありません。しかし、テンプレート内のScrollViewerが名前(ここではPART_ScrollViewer)を持つように、または別の方法でScrollViewerオブジェクトを取得するようにListViewテンプレートを調整する必要があります。

public class BetterListView : ListView 
{ 
    ScrollViewer sv; 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     //Get the scrollviewer in the template (I adapted the ListView template such that the ScrollViewer has a name property) 
     sv = (this.Template.FindName("PART_ScrollViewer", this)) as ScrollViewer; 
    } 

    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) 
    { 
     base.OnItemsChanged(e); 
     //Prevent the bug where the ListView doesn't scroll correctly when a lot of items are removed 
     if (sv != null && e.Action == NotifyCollectionChangedAction.Remove) 
     { 
      sv.InvalidateScrollInfo(); 
     } 
    } 
} 
+0

こんにちは、このメソッドを試しましたが、this.Template.FindName( "PART_ScrollViewer"、this)戻り値null。 – VHanded

関連する問題