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

ListView(ListBoxも)で単一選択モードのときに項目を追加したときの挙動を変えたい

$
0
0

ListViewのSelectionModeをSingleにした状態で、先頭に要素を追加したりすると、勝手に選択項目にスクロールしてしまいます。

場合によっては嬉しいのかもしれないですが余計な動作と感じることもあるので、OFFにしたい…!と思って調べたら、そういうプロパティがみつかりませんでした。

実現方法

複数選択できるMultipleだと、選択項目があっても勝手にそこへスクロールしません。なので、SelectionChangedイベントで単一選択になるように制御してやります。なので、こんなビヘイビアを作っておいて、ぽとっとすれば完了ですね。

using Microsoft.Xaml.Interactivity;
using System;
using System.Diagnostics;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App6
{
    [TypeConstraint(typeof(ListView))]
    publicclass SingleSelectBehavior : DependencyObject, IBehavior
    {
        private ListView AssociatedObject { get; set; }

        DependencyObject IBehavior.AssociatedObject
        {
            get { returnthis.AssociatedObject; }
        }

        publicvoid Attach(DependencyObject associatedObject)
        {
            var lv = associatedObject as ListView;
            if (lv == null)
            {
                thrownew InvalidOperationException();
            }

            this.AssociatedObject = lv;
            this.AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
        }

        privatevoid AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // 何か選択されたらif (e.AddedItems.Any())
            {
                // とりあえず1つだけ選択状態にするthis.AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
                this.AssociatedObject.SelectedItems.Clear();
                this.AssociatedObject.SelectedItems.Add(e.AddedItems.First());
                this.AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
            }
        }

        publicvoid Detach()
        {
            this.AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
        }
    }
}

Viewing all articles
Browse latest Browse all 1387

Trending Articles



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