「Xamarin.MacのNSTableViewでNSTableViewSourceを使う」の版間の差分

編集の要約なし
imported>Administrator
 
(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を簡単に扱うための便利クラスがあるようだ。