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);
        }