「Xamarin.MacのNSTableViewでNSTableViewSourceを使う」の版間の差分
編集の要約なし |
imported>Administrator 細 Administrator がページ「Xamarin.Mac/NSTableViewでNSTableViewSourceを使う」を「Xamarin.MacのNSTableViewでNSTableViewSourceを使う」に移動しました |
||
| (2人の利用者による、間の3版が非表示) | |||
| 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) | |||
{ | |||
// CellベースではNSStringを返せばよかったが、ViewベースではNSView派生クラスを返さねばならない。 | |||
// NSTableCellViewを返すとCellベースと同じような使用感となる。 | |||
// カスタムセルを使用する場合は分岐するとよい。 | |||
default: | |||
var cellView = (NSTableCellView)tableView.MakeView(tableColumn.Identifier, this); | |||
cellView.TextField.StringValue = val.ToString(); | |||
return cellView; | |||
} | |||
} | |||
</source> | |||
あとはCellベースと同じ。 | |||
== 実装1:Cell Base == | == 実装1:Cell Base == | ||
[[Xamarin.Mac]]にはNSTableViewSourceというNSTableViewを簡単に扱うための便利クラスがあるようだ。 | [[Xamarin.Mac]]にはNSTableViewSourceというNSTableViewを簡単に扱うための便利クラスがあるようだ。 | ||