Question

Je construis une application à l'aide du motif Contrôleur de supervision (présentateur de vue de modèle) et je fais face à une difficulté. Dans ma page, j'ai un contrôle de répéteur qui affiche chaque élément d'une collection que je lui transmets. L'élément reapeater contient 2 listes déroulantes qui permettent à l'utilisateur de sélectionner une valeur particulière. Lorsque je clique sur le bouton suivant, je veux que le contrôleur récupère ces valeurs.

Comment puis-je le faire de manière propre?

Était-ce utile?

La solution

Vous pouvez également créer une interface de "widget" pour la liste déroulante. Je vais vous donner un exemple simple de code fonctionnel pour un widget TextBox afin que vous ayez une idée.

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

Notez que jusqu'à présent, tout est agnostique en matière de technologie. Maintenant, voici une implémentation pour une zone de texte Win Forms:

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

Ceci est instancié dans le formulaire lui-même, ce qui revient à MVP est également IViewW Whatever:

public partial class ProjectPickerForm : Form, IProjectPickerView
{

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

Et dans le présentateur:

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

Cela semble pire que de le configurer parce que la plupart du travail est assez mécanique une fois que vous avez eu l’idée. La partie propre est que le présentateur peut obtenir (et définir) toutes les informations dont il a besoin sur le widget sans connaître ni se soucier de ce que le widget réellement implémenté est. Il se prête également à la réutilisation avec d’autres widgets (vous en construisez une bibliothèque) du même type (Win Forms ici) et dans d’autres technologies d’interface utilisateur selon vos besoins (une fois que vous avez la classe interface / base, la mise en œuvre dans une autre technologie est banal). Il est également facile de tester avec des objets fictifs, car vous avez l'interface. Et votre interface utilisateur ignore maintenant à peu près tout, sauf les tâches liées à l'interface utilisateur. L'inconvénient est le nombre de classes par widget et une petite courbe d'apprentissage pour s'y familiariser.

Pour le menu déroulant, vous avez peut-être simplement besoin de l'événement de type SelectedIndexChanged, que vous substituez à cet exemple de l'événement TextChanged.

Autres conseils

Lorsque l'interaction vue-contrôleur est trop complexe, je les divise généralement en sous-contrôleurs et sous-vues.

Les éléments du répéteur peuvent être des contrôles utilisateur ayant leurs propres vues et contrôleurs. Votre vue principale peut alors avoir une liste de sous-vues (contrôles utilisateur) ayant leurs propres contrôleurs gérés par le contrôleur principal.

Lorsque l'utilisateur clique à côté de votre contrôleur principal, il peut demander à tous les sous-contrôleurs d'actualiser leurs éléments à partir de leurs vues.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top