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