Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

Universal Windows Platform appのListViewで追加されたアイテムに自動でスクロールさせたい

$
0
0

ということをしたいというケースがありました。

やり方としては、ItemsSourceがINotifyCollectionChangedだったら追加されたCollectionChangedを購読して追加された要素に対してScrollIntoViewしてやるだけです。 とりあえず、こういうBehaviorを作ってListViewにぽとっと落として実現しました。

publicclass ScrollBottomBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject
    {
        get;
        set;
    }

    private INotifyCollectionChanged currentItemsSource;

    publicvoid Attach(DependencyObject associatedObject)
    {
        this.AssociatedObject = associatedObject;
        var lv = this.AssociatedObject as ListView;
        lv.DataContextChanged += (_, __) =>
        {
            if (this.currentItemsSource != null)
            {
                this.currentItemsSource.CollectionChanged -= this.CurrentItemsSource_CollectionChanged;
            }
            this.currentItemsSource = lv.ItemsSource as INotifyCollectionChanged;
            if (this.currentItemsSource != null)
            {
                this.currentItemsSource.CollectionChanged += this.CurrentItemsSource_CollectionChanged;
            }
        };
    }

    privatevoid CurrentItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action != NotifyCollectionChangedAction.Add)
        {
            return;
        }

        var item = e.NewItems.Cast<ChatMessageViewModel>().First();
        ((ListView)this.AssociatedObject).ScrollIntoView(item);
    }

    publicvoid Detach()
    {
        if (this.currentItemsSource != null)
        {
            this.currentItemsSource.CollectionChanged -= this.CurrentItemsSource_CollectionChanged;
            this.currentItemsSource = null;
        }
    }
}

Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>