Windows Phone Toolkit 紹介 その11 LoopingSelector

木曜日 , 15, 3月 2012 Leave a comment

導入

 

LoopingSelectorはDatePickerやTimePickerのようなコントロールを自作できるコントロールです。

 

導入時には毎度のdllの追加とxmlnsの追加が必要ですが、これまでのコントロールと異なり

 

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls.Primitives;assembly=Microsoft.Phone.Controls.Toolkit"

 

なので注意。

 

ILoopingSelectorDataSource

 

 LoopingSelecterにデータを渡す場合DataSourceプロパティにコレクションを渡すのですがこれがよくあるIEnumelableをインプリメントしたものではなく、ILoopingSelectorDataSourceをインターフェイスとして持つクラスを作る必要があります。

 

 これのせいでこのコントロールの説明はちょっと長くなります・・・。

 

 まずはILoopingSelectorDataSourceの定義を見てみましょう。

using System;
using System.Windows.Controls;

namespace Microsoft.Phone.Controls.Primitives
{
    public interface ILoopingSelectorDataSource
    {
        object SelectedItem { get; set; }

        event EventHandler<SelectionChangedEventArgs> SelectionChanged;

        object GetNext(object relativeTo);
        object GetPrevious(object relativeTo);
    }
}

 

SelectedItemというプロパティ、

SelectionChangedというイベントハンドラー

GetNext、GetPreviousというメソッドが必要なことがわかる。

実装は以下のようになる

 

    /**
     * 1から4までをリストに表示させるサンプル
     */
    public class LoopingDataSourceSample : ILoopingSelectorDataSource
    {
        private object selectedItem = 3;
        public object SelectedItem
        {
            get
            {
                return this.selectedItem;
            }
            set
            {
                if (!object.Equals(this.selectedItem, value))
                {
                    object previousSelectedItem = this.selectedItem;
                    this.selectedItem = value;

                    this.OnSelectionChanged(previousSelectedItem, this.selectedItem);
                }
            }
        }

        private List<int> list = new List<int>{1, 2, 3, 4};

        public object GetNext(object relativeTo)
        {
            int value = (int)relativeTo;
            foreach (var num in list)
            {
                if (value == (num - 1))
                {
                    return value + 1;
                }
            }

            return null;
        }

        public object GetPrevious(object relativeTo)
        {
            int value = (int)relativeTo;
            foreach (var num in list)
            {
                if (value == (num + 1))
                {
                    return value - 1;
                }
            }

            return null;
        }

        public event EventHandler<SelectionChangedEventArgs> SelectionChanged;

        protected virtual void OnSelectionChanged(object oldSelectedItem, object newSelectedItem)
        {
            EventHandler<SelectionChangedEventArgs> handler = this.SelectionChanged;
            if (handler != null)
            {
                handler(this, new SelectionChangedEventArgs(new object[] { oldSelectedItem }, new object[] { newSelectedItem }));
            }
        }
    }

あとは、下記のようにDataSourceプロパティに突っ込んであげる。

 this.selector.DataSource = new LoopingDataSourceSample();

これで簡単なサンプルができあがり。

 


Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です