差分

ナビゲーションに移動 検索に移動

Xamarin.MacのNSTableViewでNSTableViewSourceを使う

2,261 バイト追加, 2017年10月23日 (月) 06:01
編集の要約なし
== 実装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を簡単に扱うための便利クラスがあるようだ。
匿名利用者

案内メニュー