差分
編集の要約なし
== 実装2:View Base ==
[[Xamarin.Mac]]にはNSTableViewSourceというNSTableViewを簡単に扱うための便利クラスがあるようだ。
=== 列となるデータを準備する ===
まずはソースの元(テーブルの1行)となるクラスを用意する。
<source lang="csharp">
public class Study
{
public string Id { get; set; }
public string Name { get; set; }
}
</source>
== 行となるデータソースを準備する ==
次にデータソースを用意する。
NSTableViewSourceクラスを継承してGetRowCountメソッドとGetViewForItemメソッドをオーバーライドすることで利用可能な状態となる。
Cellベースでは「GetObjectValue」のところがViewベースでは「GetViewForItem」となっている。
この例ではNSTableColumnクラスのIdentifierプロパティの値と、前述のStudyクラスの各プロパティ名の簡易自動マッピングを行っている。NSTableColumnクラスのIdentifierプロパティはInterface Builderで設定した。
また、別途IList<>インターフェースを実装しておくとLINQで操作できたり色々便利だった。無くてもよい。
<source lang="csharp">
public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row)
{
if (tableColumn.Identifier == null)
{
return null;
}
var item = _items[(int)row];
var type = typeof(Study);
var prop = type.GetProperty(tableColumn.Identifier, BindingFlags.Public | BindingFlags.Instance);
if (prop == null)
{// そんな名前のプロパティはない
return null;
}
var val = prop.GetValue(item);
if (val == null)
{// 空っぽですわ
return null;
}
switch (tableColumn.Identifier)
{
default:
var cellView = (NSTableCellView)tableView.MakeView(tableColumn.Identifier, this);
cellView.TextField.StringValue = val.ToString();
return cellView;
}
}
</source>
== 実装1:Cell Base ==
[[Xamarin.Mac]]にはNSTableViewSourceというNSTableViewを簡単に扱うための便利クラスがあるようだ。