¿Cómo puedo pasar datos a los delegates de MonoTouch.Dialog?

Dado el siguiente código, ¿cómo puedo pasar datos de "Nombre", "Apellido", etc. a mi método BookASession.SendMessage(); ?

 RootElement CreateBookASessionRoot() { return new RootElement("Book a Session") { new Section() { new EntryElement("First Name", "First Name", ""), new EntryElement("Last Name", "Last Name", ""), new EntryElement("Email", "Email", "") { KeyboardType = UIKeyboardType.EmailAddress }, new DateElement("Event Date", DateTime.Now), new RootElement ("Type of Shoot", new RadioGroup (0)){ new Section (){ new RadioElement("Wedding"), new RadioElement("Portrait"), new RadioElement("Boudoir"), new RadioElement("Other") } } , new EntryElement("Message", "Message", "") } , new Section () { new StringElement("Send", delegate { BookASession.SendMessage(); } ) } }; } 

La forma en que me gusta lograr esto es manteniendo references a mis elementos de input. De esta forma, puedo search fácilmente sus valores de input sin tener que search a través del tree de elementos completo. Lo hago encapsulando la lógica de creación para una pantalla particular en una class separada, como esta:

 public class BookASessionScreen { private RootElement _root = null; private EntryElement _firstName = null; private EntryElement _lastName = null; private EntryElement _email = null; private DateElement _date = null; private RootElement _typeOfShoot = null; private EntryElement _message = null; private void CreateRoot() { _firstName = new EntryElement("First Name", "First Name", ""); _lastName = _firstName = new EntryElement("First Name", "First Name", ""); _email = new EntryElement("Email", "Email", "") { KeyboardType = UIKeyboardType.EmailAddress }; _date = new DateElement("Event Date", DateTime.Now); _typeOfShoot = new RootElement ("Type of Shoot", new RadioGroup (0)){ new Section () { new RadioElement("Wedding"), new RadioElement("Portrait"), new RadioElement("Boudoir"), new RadioElement("Other") } }; _message = new EntryElement("Message", "Message", ""); _root = new RootElement("Book a Session") { new Section() { _firstName, _lastName, _email, _date, _typeOfShoot, _message } , new Section () { new StringElement("Send", delegate { //BookASession.SendMessage(_firstName.Value, _lastName.Value, ...) }) } }; } public RootElement Root { get { if (_root == null) { CreateRoot(); } return _root; } } } 

Además, es posible que desee desacoplar la lógica de procesamiento del formulario haciendo que la class exponga un evento, como este:

1 – Cree una class que contenga los datos del evento, ampliando EventArgs:

 public class BookASessionArgs : EventArgs { public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } } 

2 – Declara su evento en BookASessionScreen:

 public event EventHandler BookASession; 

3 – Dispara el evento en tu delegado

 if (BookASession != null) { BookASession(this, new BookASessionArgs() { FirstName = _firstName.Value, LastName = _lastName.Value //.. }); } 

El problema con las properties de valor que no se actualizan puede resolverse llamando al método ResignFirstResponder en el elemento que tiene foco. Supongo que esto es algo específico de iOS.