The way I like it is with links to my input elements. That way, I can easily get my input values without having to search the entire tree of elements. I do this by encapsulating the creation logic for a particular screen in a separate clan, for example:
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 {
In addition, you may need to separate the form processing logic from the fact that the class exposes the event, for example:
1 - Create a class that will contain the event data, expanding EventArgs:
public class BookASessionArgs : EventArgs { public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } }
2 - Announce your event in BookASessionScreen:
public event EventHandler BookASession;
3 - Empty the event in your delegate
if (BookASession != null) { BookASession(this, new BookASessionArgs() { FirstName = _firstName.Value, LastName = _lastName.Value