LoopingSelectorはDatePickerやTimePickerのようなコントロールを自作できるコントロールです。
導入時には毎度のdllの追加とxmlnsの追加が必要ですが、これまでのコントロールと異なり
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls.Primitives;assembly=Microsoft.Phone.Controls.Toolkit"
なので注意。
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