Pregunta

Estoy creando una aplicación usando el patrón Supervising Controller (Model View Presenter) y me enfrento a una dificultad. En mi página tengo un control de repetidor que mostrará cada elemento de una colección que le estoy pasando. El elemento del repetidor contiene 2 listas desplegables que permiten al usuario seleccionar un valor particular. Cuando hago clic en el botón Siguiente, quiero que el controlador recupere esos valores.

¿Cómo puedo hacer eso de una manera limpia?

¿Fue útil?

Solución

También puede crear una interfaz 'widget' para el menú desplegable. Te daré un ejemplo sencillo de un código funcional para un widget TextBox para que entiendas la idea.

public interface ITextWidget
{
    event EventHandler TextChanged;
    string Text { get; set; }
}

public abstract class TextWidget<T> : ITextWidget
{

    protected T _wrappedWidget { get; set; }
    public event EventHandler TextChanged;

    protected void InvokeTextChanged(object sender, EventArgs e)
    {
        var textChanged = TextChanged;
        if (textChanged != null) textChanged(this, e);
    }

    public abstract string Text { get; set; }
}

Observe que hasta ahora todo es independiente de la tecnología. Ahora aquí hay una implementación para un Win Forms TextBox:

public class TextBoxWidget : TextWidget<TextBox>
{

    public TextBoxWidget(TextBox textBox)
    {
        textBox.TextChanged += InvokeTextChanged;
        _wrappedWidget = textBox;
    }

    public override string Text
    {
        get { return _wrappedWidget.Text; }
        set { _wrappedWidget.Text = value; }
    }
}

Esto se instancia en el propio formulario, que de vuelta a MVP también es IViewWhatever:

public partial class ProjectPickerForm : Form, IProjectPickerView
{

    private IProjectPickerPresenter _presenter;
    public void InitializePresenter(IProjectPickerPresenter presenter) {
        _presenter = presenter;
        _presenter.InitializeWidgets(
            ...
            new TextBoxWidget(txtDescription));
    }
            ...
}

Y en el presentador:

public class ProjectPickerPresenter : IProjectPickerPresenter
{
    ...
    public void InitializeWidgets(ITextWidget descriptionFilter) {

        Check.RequireNotNull<ITextWidget>(descriptionFilter, "descriptionFilter");
        DescriptionFilter = descriptionFilter;
        DescriptionFilter.Text = string.Empty;
        DescriptionFilter.TextChanged += OnDescriptionTextChanged;

    }
    ...

    public void OnDescriptionTextChanged(object sender, EventArgs e) {
        FilterService.DescriptionFilterValue = DescriptionFilter.Text;
    }

Se ve peor de lo que es configurar porque la mayoría del trabajo es bastante mecánico una vez que se tiene la idea. La parte limpia es que el presentador puede obtener (y configurar) cualquier información que necesite en el widget sin saber o importar cuál es el widget implementado real. También se presta para reutilizarse con otros widgets (terminas construyendo una biblioteca de ellos) del mismo tipo (Win Forms here) y en otras tecnologías de IU según sea necesario (una vez que tienes la interfaz / clase base, la implementación en otra tecnología es trivial). También es fácil de probar con objetos simulados porque tiene la interfaz. Y su interfaz de usuario ahora es maravillosamente ignorante de casi todo menos las tareas relacionadas con la interfaz de usuario. La desventaja es el conjunto de clases por widget y una pequeña curva de aprendizaje para sentirse cómodo con él.

Para su menú desplegable, es posible que solo necesite el evento de tipo SelectedIndexChanged, que sustituiría por este ejemplo de evento TextChanged.

Otros consejos

Cuando la interacción de la vista del controlador se vuelve demasiado compleja, generalmente los divido en subcontroladores y subvistas.

Puede hacer que los elementos en el repetidor sean controles de usuario que tengan sus propias vistas y controladores. Su vista principal puede tener una lista de subvistas (controles de usuario) que tienen sus propios controladores que son mantenidos por el controlador principal.

Cuando el usuario hace clic a continuación, su controlador principal puede indicar a todos los subcontroladores que actualicen sus elementos desde sus vistas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top