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.
Dans quelle langue avez-vous construit votre application? –