Frage

Ich baue eine Anwendung des Supervising Controller-Muster (Model-View-Presenter) mit und ich eine Schwierigkeit bin vor. In meiner Seite habe ich ein Repeater-Steuerelement, das jedes Element einer Sammlung anzuzeigen werde ich es bin vorbei. Der reapeater Artikel enthält zwei Drop-Down-Liste, die es dem Benutzer ermöglichen, einen bestimmten Wert zu wählen. Wenn ich die nächste Schaltfläche klicken, möchte ich die Steuerung diese Werte abzurufen.

Wie kann ich tun, dass ich eine saubere Art und Weise?

War es hilfreich?

Lösung

Sie können auch ein ‚Widget‘ -Schnittstelle für den Drop-Down machen. Ich gebe Ihnen ein einfaches Beispiel eines gewissen Arbeits-Code für eine TextBox-Widget, so dass Sie die Idee.

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

Beachten Sie, dass bisher alles Technologie agnostisch ist. Nun, hier ist eine Implementierung für eine TextBox 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; }
    }
}

Dies wird in dem Formular instanziiert selbst, das MVP zurück ist auch die IViewWhatever:

public partial class ProjectPickerForm : Form, IProjectPickerView
{

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

Und im Presenter:

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

Es sieht schlimmer aus, als es der Einrichtung ist, weil die meisten der Arbeit ziemlich mechanisch ist, wenn Sie die Idee. Der saubere Teil ist, dass der Moderator bekommen (und setzt), was info es auf dem Widget muss, ohne zu wissen oder Pflege, was die tatsächliche Umsetzung Widget ist. Es eignet sich auch mit anderen Widgets wieder zu verwenden (Sie aufzuwickeln den Aufbau einer Bibliothek von ihnen) des gleichen Typs (Win Forms hier) und in anderen UI-Technologien je nach Bedarf (wenn man das Interface / Basisklasse haben die Umsetzung in einer anderen Technologie trivial). Es ist auch einfach, mit Mock-Objekte zu testen, da Sie die Schnittstelle haben. Und Ihre UI ist jetzt wunderbar unwissend von gerade über alles, aber UI bezogene Aufgaben. Der Nachteil ist, das Bündel von Klassen pro Widget und eine wenig Einarbeitungszeit, um sich bequem mit ihm.

Für Ihre Drop-down, deine Macht muß nur die SelectedIndexChanged Art Veranstaltung, die Sie für diese Beispiele ersetzen würden Textchanged-Ereignis aus.

Andere Tipps

Wenn der Controller-Ansicht interation ist zu komplex ich teilten sie in der Regel bis in Subcontrollern und Subviews.

können Sie haben die Elemente in der Repeater-Benutzer-Kontrollen, die ihre eigenen Ansichten und Controller haben. Ihre Hauptansicht kann dann eine Liste von Subviews (Usercontrols), die ihre eigenen Controllern, die durch die Hauptsteuerung beibehalten werden.

Wenn der Benutzer klickt neben Ihrem Haupt-Controller alle Subcontrollern signalisieren können ihre Produkte von ihren Ansichten zu aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top