¿Cómo encapsular una vista de MonoTouch.Dialog en un controller de vista?

Estoy escribiendo un controller de vista para agregar un nuevo elemento a mi aplicación. Es un ajuste perfecto para MonoTouch.Dialog, ya que se puede hacer fácilmente con una interfaz basada en tablas, con un campo por propiedad relevante de mi artículo.

Este es el código que tengo actualmente para mostrar la vista Agregar elementos (simplificado, pero la idea central permanece):

Item item = new Item(); TapHandler handler = new TapHandler(); BindingContext bc = new BindingContext(handler, item, "Add Item"); DialogViewController dv = new DialogViewController(bc.Root, true); this.NavigationController.PushViewController(dv, true); 

Si bien eso funciona, preferiría que pudiera encapsular los detalles de la vista en su propio controller de vista, por lo que el código podría verse así:

 UIViewController controller = new AddItemViewController(); this.NavigationController.PushViewController(controller, true); 

Sin embargo, no puedo entender cómo implementar esto. Pensé que lo lógico sería hacer una subclass de DialogViewController . Sin embargo, todos los constructores de DialogViewController requieren un RootElement . Para getlo, primero debe crear el BindingContext . Como no puede ejecutar ningún código antes de llamar al constructor base, no termina funcionando.

Mi segundo enfoque fue implementar la subclass UIViewController , crear el DialogViewController y agregar el controller de vista de dialog como hijo de mi subclass usando este. this.AddChildViewController(dv) y this.View.AddSubView(dv.View) . Si bien esto funciona inicialmente, si tiene el controller de vista nuevo en un UINavigationController y hace clic en un elemento de date, la vista de date aparece como una window emergente modal en lugar de en la jerarquía del controller de navigation. (Esto tiene sentido, ya que DialogViewController no forma parte de la jerarquía de NavigationController en este layout).

Desde allí estoy atrapado. No pude encontrar ningún ejemplo de usar MonoTouch.Dialog así en los ejemplos. ¿Es posible hacer esto? O si no es así, ¿hay una buena razón de por qué escribir un código como este es una mala idea?

Como no puede ejecutar ningún código antes de llamar al constructor de base

Eso no es del todo correcto.

No es ideal, pero puede henetworkingar desde DialogViewController y proporcionarle una instancia vacía de RootElement , como esta:

 public class AddItemViewController : DialogViewController { public AddItemViewController () : base (new RootElement ()) { } } 

Más tarde, puede agregar sus elementos (o establecer un nuevo RootElement ) a la propiedad Root , por ejemplo,

 void Populate () { this.Root.Add (new Section () { ... }); } 

Encontré una manera de hacer esto, aunque parece un poco desorderado (gracias, poupou por darme la idea). Acabo de establecer Root a nulo en la llamada del constructor base, y luego lo fijo de inmediato en el método del contructor:

 class NewItemViewController : DialogViewController { private Item _item; public NewItemViewController(bool pushing) : base(null, pushing) { _item = new Item(); BindingContext bc = new BindingContext(this, _item, "Add Item"); this.Root = bc.Root; // more setup } // more methods } 

No sabía que podrías cambiar el object Root, no solo acceder a él.