2

WPF ListViewの基になるコレクションが変更されたときに、スクロールバーのサイズを正しく変更するにはどうすればよいですか?

数千のアイテムを含む監視可能なコレクションにバインドされたWPFListViewがあります。これらの多くが削除されると、ビューには最後のアイテムのみが表示されるように見えます。サムバーを使用してビュー内の位置を移動すると、新しいコレクションサイズを反映するようにサムバーのサイズが変更されます。コレクションが変更されたときに、ListViewとスクロールバーを強制的に同期させることはできますか?

4

3 に答える 3

2

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

次のコード例は、最初の行で変更された ListView ベニングの項目ソースを示しています。次の行は、最初の項目にスクロールして戻るだけの回避策を示しています。

this.ListViewResults.ItemsSource = this.itemsFiltered;

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

if(firstItem == null)
{
    return;
}

this.ListViewResults.ScrollIntoView(firstItem);
于 2009-07-06T14:12:51.977 に答える
0

ListViewのサブクラス化を必要とする別の回避策があります。少し手間がかかりますが、最初の項目までスクロールするよりも良い結果が得られます。ただし、テンプレート内のScrollViewerに名前(ここではPART_ScrollViewer)が付けられるように、ListViewテンプレートを調整するか、別の方法を使用してScrollViewerオブジェクトを取得する必要があります。

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();
        }
    }
}
于 2009-09-02T06:57:59.630 に答える
0

挙動がおかしい!!

ListView のバインディング コンテキスト (Context) を null に設定してから、バインディングを更新するために同じリストをもう一度設定してみます。

于 2009-07-06T13:54:19.380 に答える