2008-11-06 9 views
1

Je suis en train de créer une application à l'aide du modèle Contrôleur de supervision (Model View Presenter) et je suis confronté à une difficulté. Dans ma page j'ai un contrôle de répéteur qui montrera chaque article d'une collection que je lui passe. 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.Présentation du modèle Présentateur et répéteur

Comment puis-je faire cela d'une manière propre?

+0

Dans quelle langue avez-vous construit votre application? –

Répondre

2

Vous pouvez également créer une interface "widget" pour la liste déroulante. Je vais vous donner un exemple simple d'un code de travail pour un widget TextBox afin que vous ayez l'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 une technologie agnostique. Maintenant, voici une implémentation pour 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; } 
    } 
} 

Cela s'instancié dans le formulaire lui-même, de retour au joueur par excellence est aussi le IViewWhatever:

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

Il semble que ce soit pire que la configuration parce que la plupart du travail est assez mécanique une fois que vous avez 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 savoir ou se soucier de ce que le widget implémenté est réellement. 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 d'autres technologies d'interface utilisateur si nécessaire (une fois que vous avez la classe interface/base banal). Il est également facile de tester avec des objets simulés parce que vous avez l'interface. Et votre interface utilisateur est maintenant merveilleusement ignorante de tout sauf des tâches liées à l'interface utilisateur. L'inconvénient est le groupe de classes par widget et un peu de courbe d'apprentissage pour se familiariser avec elle.

Pour votre liste déroulante, vous aurez peut-être besoin de l'événement de type SelectedIndexChanged, que vous substituerez à cet exemple d'événement TextChanged.

1

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

Vous pouvez faire en sorte que les éléments du répéteur soient des contrôles utilisateur disposant de leurs propres vues et contrôleurs. Votre vue principale peut alors avoir une liste de sous-vues (usercontrols) qui ont leurs propres contrôleurs qui sont maintenus par le contrôleur principal. Lorsque l'utilisateur clique sur Suivant, votre contrôleur principal peut signaler à tous les sous-contrôleurs d'actualiser leurs éléments à partir de leurs vues.

Questions connexes