Xamarin.iOSでPickerViewを描画する方法です。
StoryBoard
iOS DesignerもしくはInterface Builderで、StoryBoardでUIPickerViewを配置して、Identifierをセットします。
コード
ViewController
ViewDidLoadメソッドで、StoryBoardでセットしたUIPickerViewのModelに、これから自分で作るUIPickerDataModelクラスを継承したサブクラスのインスタンスをセットします。
大事なのはUIPickerViewで選択された値をViewControllerで検知しないと、その後の処理で使えないので注意です。そのためにクラスのフィールドに、検知した値をセットする変数を設けておきましょう。
public partial class ViewController : UIViewController
{
int selectedItemId;
protected ViewController(IntPtr handle) : base(handle)
{
// Note: this .ctor should not contain any initialization logic.
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
// Perform any additional setup after loading the view, typically from a nib.
// UIPickerViewを生成する
var pickerDataModel = new pickerDataModel();
Picker.Model = pickerDataModel;
pickerDataModel.ValueChanged += (sender, e) =>
{
selectedItemId = itemPickerDataModel.SelectedItem.Item1;
};
}
}
UIPickerViewModelのサブクラス
UIPickerViewModelのサブクラスでは必須メソッドの他に、Eventプロパティを設けて、選択されたときに値が変わったことを通知できるようにします。
以下の例ではItemというクラスがあって、ItemIdとItemNameというプロパティがあるということにします。
public class pickerDataModel : UIPickerViewModel
{
// プロパティの変更を検知するプロパティ
public event EventHandler<EventArgs> ValueChanged;
// Pickerに表示するデータを格納するフィールド
List<Item> items = new List<Item>();
// 選択された値を取得するメソッド
public Tuple<int, string> SelectedItem
{
get
{
var returnType = new Tuple<int, string>(items[selectedIndex].ItemId, items[selectedIndex].ItemName);
return returnType;
}
}
int selectedIndex;
// コンストラクター
public pickerDataModel()
{
items = new List<Item>();
}
// カラム数
public override nint GetComponentCount(UIPickerView pickerView)
{
return 1;
}
// 行数
public override nint GetRowsInComponent(UIPickerView pickerView, nint component)
{
return items.Count;
}
// 文字列取得
public override string GetTitle(UIPickerView pickerView, nint row, nint component)
{
return items[(int)row].ItemName;
}
// 選択されたときの挙動
public override void Selected(UIPickerView pickerView, nint row, nint component)
{
selectedIndex = (int)row;
if (ValueChanged != null)
{
ValueChanged(this, new EventArgs());
}
}
}
このサイトを参考にしました。
SIN@SAPPOROWORKSの覚書
あともう1つ参考にしたサイトがあったのですが、失念…探し出せたら再掲します。