public override void AwakeFromNib() { base.AwakeFromNib(); //----------------------------------------------------------------------------- // Compiler directive USE_BINDINGS_BY_CODE set in the projects Options // 1) From the MonoDevelop Menu select Project -> NSTableViewBinding Options // This will bring up the project options panel. // 2) Under the category Build -> Compiler look for the field labeled Define Symbols half way // down the panel page. // 3) Add the symbol USE_BINDINGS_BY_CODE //----------------------------------------------------------------------------- // Your NSTableView's content needs to use Cocoa Bindings, // use Interface Builder to setup the bindings like so: // // Each column in the NSTableView needs to use Cocoa Bindings, // use Interface Builder to setup the bindings like so: // // columnIdentifier: "firstname" // "value" = arrangedObjects.firstname [NSTableArray (NSArrayController)] // Bind To: "TableArray" object (NSArrayController) // Controller Key = "arrangedObjects" // Model Key Path = "firstname" ("firstname" is a key in "TableArray") // // columnIdentifier: "lastname" // "value" = arrangedObjects.lastname [NSTableArray (NSArrayController)] // Bind To: "TableArray" object (NSArrayController) // Controller Key = "arrangedObjects" // Model Key Path = "lastname" ("lastname" is a key in "TableArray") // // columnIdentifier: "phone" // "value" = arrangedObjects.phone [NSTableArray (NSArrayController)] // Bind To: "TableArray" object (NSArrayController) // Controller Key = "arrangedObjects" // Model Key Path = "phone" ("phone" is a key in "TableArray") // // or do bindings by code: #if USE_BINDINGS_BY_CODE NSTableColumn firstNameColumn = myTableView.FindTableColumn(FIRST_NAME); firstNameColumn.Bind("value", myContentArray, "arrangedObjects.firstname", null); NSTableColumn lastNameColumn = myTableView.FindTableColumn(LAST_NAME); lastNameColumn.Bind("value", myContentArray, "arrangedObjects.lastname", null); NSTableColumn phoneColumn = myTableView.FindTableColumn(PHONE); phoneColumn.Bind("value", myContentArray, "arrangedObjects.phone", null); #endif // for NSTableView "double-click row" to work you need to use Cocoa Bindings, // use Interface Builder to setup the bindings like so: // // NSTableView: // "doubleClickArgument": // Bind To: "TableArray" object (NSArrayController) // Controller Key = "selectedObjects" // Selector Name = "inspect:" (don't forget the ":") // // "doubleClickTarget": // Bind To: (File's Owner) MyWindowController // Model Key Path = "self" // Selector Name = "inspect:" (don't forget the ":") // // ... also make sure none of the NSTableColumns are "editable". // // or do bindings by code: #if USE_BINDINGS_BY_CODE List <NSObject> doubleClickObjects = new List <NSObject> { new NSString("inspect:"), NSNumber.FromBoolean(true), NSNumber.FromBoolean(true) }; List <NSString> doubleClickKeys = new List <NSString> { new NSString("NSSelectorName"), new NSString("NSConditionallySetsHidden"), new NSString("NSRaisesForNotApplicableKeys") }; NSDictionary doubleClickOptionsDict = NSDictionary.FromObjectsAndKeys(doubleClickObjects.ToArray(), doubleClickKeys.ToArray()); myTableView.Bind("doubleClickArgument", myContentArray, "selectedObjects", doubleClickOptionsDict); myTableView.Bind("doubleClickTarget", this, "self", doubleClickOptionsDict); #endif // the enabled states of the two buttons "Add", "Remove" are bound to "canRemove" // use Interface Builder to setup the bindings like so: // // NSButton ("Add") // "enabled": // Bind To: "TableArray" object (NSArrayController) // Controller Key = "canAdd" // // NSButton ("Remove") // "enabled": // Bind To: "TableArray" object (NSArrayController) // Controller Key = "canRemove" // // or do bindings by code: #if USE_BINDINGS_BY_CODE List <NSObject> enableOptionsObjects = new List <NSObject> { NSNumber.FromBoolean(true) }; List <NSString> enableOptionsKeys = new List <NSString> { new NSString("NSRaisesForNotApplicableKeys") }; NSDictionary enableOptionsDict = NSDictionary.FromObjectsAndKeys(enableOptionsObjects.ToArray(), enableOptionsKeys.ToArray()); addButton.Bind("enabled", myContentArray, "canAdd", enableOptionsDict); removeButton.Bind("enabled", myContentArray, "canRemove", enableOptionsDict); #endif // the NSForm's text fields is bound to the current selection in the NSTableView's content array controller, // use Interface Builder to setup the bindings like so: // // NSFormCell: // "value": // Bind To: "TableArray" object (NSArrayController) // Controller Key = "selection" // Model Key Path = "firstname" // // or do bindings by code: #if USE_BINDINGS_BY_CODE List <NSObject> valueOptionsObjects = new List <NSObject> { NSNumber.FromBoolean(true), NSNumber.FromBoolean(true), NSNumber.FromBoolean(true) }; List <NSString> valueOptionsKeys = new List <NSString> { new NSString("NSAllowsEditingMultipleValuesSelection"), new NSString("NSConditionallySetsEditable"), new NSString("NSRaisesForNotApplicableKeys") }; NSDictionary valueOptionsDict = NSDictionary.FromObjectsAndKeys(valueOptionsObjects.ToArray(), valueOptionsKeys.ToArray()); myFormFields.CellAtIndex(FIRST_NAME_IDX).Bind("value", myContentArray, "selection.firstname", valueOptionsDict); myFormFields.CellAtIndex(LAST_NAME_IDX).Bind("value", myContentArray, "selection.lastname", valueOptionsDict); myFormFields.CellAtIndex(PHONE_IDX).Bind("value", myContentArray, "selection.phone", valueOptionsDict); #endif // start listening for selection changes in our NSTableView's array controller myContentArray.AddObserver(this, new NSString("selectionIndexes"), NSKeyValueObservingOptions.New, IntPtr.Zero); // finally, add the first record in the table as a default value. // // note: to allow the external NSForm fields to alter the table view selection through the "value" bindings, // added objects to the content array needs to be an "NSMutableDictionary" - // List <NSString> objects = new List <NSString> { new NSString("John"), new NSString("Doe"), new NSString("(333) 333-3333)") }; var dict = NSMutableDictionary.FromObjectsAndKeys(objects.ToArray(), Keys.ToArray()); myContentArray.AddObject(dict); }