「Xamarin.MacのNSTableViewでNSTableViewSourceを使う」の版間の差分
編集の要約なし |
編集の要約なし |
||
| 1行目: | 1行目: | ||
== 実装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 == | == 実装1:Cell Base == | ||
[[Xamarin.Mac]]にはNSTableViewSourceというNSTableViewを簡単に扱うための便利クラスがあるようだ。 | [[Xamarin.Mac]]にはNSTableViewSourceというNSTableViewを簡単に扱うための便利クラスがあるようだ。 | ||