Aggiorna una casella combinata da un presentatore (MVP)

1

Uso MVP nel mio progetto, ma sono nuovo in MVP. Ho due combobox. Quando seleziono un'opzione in una casella combinata, l'altra casella combinata deve essere riempita con nuovi dati.

Questa azione verrà eseguita nel Presenter. Ho avuto la mia vista 'view1' in Presenter, e ho introdotto Combobox1 e Combobox2 come proprietà in 'view1', perché avevo bisogno di 'DataSource', 'DisplayMember', 'ValueMember' e 'Refresh ()' nel metodo seguente.

Tuttavia, quando si utilizza un modello, è sufficiente inviare una proprietà come questa:

public string Combobox2
{
    get { return comboBox1.SelectedValue.ToSstring(); }
}

nel Presenter, non nell'intero Combobox. Come posso risolvere questo problema?

public void OnSelectedIndexChangedCombobox1()
{
    if (view1.Combobox1.SelectedIndex == -1)
    {
        return;
    }

    DataTable dt = Tools.GetDataTable("A Path");

    var query =
        (from o in dt.AsEnumerable()
         where o.Field<string>("afield") == 
             farmerView.Combobox1.SelectedValue.ToString()
         orderby o.Field<string>("anotherfield")
         select new KeyValuePair<string, string>(o.Field<string>("field1"), 
             o.Field<string>("field2"))).ToList();

    farmerView.Combobox2SelectedIndexChanged -= OnSelectedIndexChangedCombobox2;

    farmerView.Combobox2.DataSource = new BindingSource(query, null);
    farmerView.Combobox2.DisplayMember = "Value";  
    farmerView.Combobox2.ValueMember = "Key";   
    farmerView.Combobox2.Refresh();
    farmerView.Combobox2SelectedIndexChanged += 
       OnSelectedIndexChangedCombobox2;

    farmerView.Combobox2.SelectedIndex = -1;
}

Aggiornamento:

Ho usato questo metodo:

public void OnSelectionChangeCommittedCombobox1()
{
    if (View1.Combobox1SelectedIndex == -1)
    {
        return;
    }

    DataTable dt = Tools.GetDataTable("A Path");

    var query =
        (from o in dt.AsEnumerable()
         where o.Field<string>("afield") == 
             farmerView.Combobox1.SelectedValue.ToString()
         orderby o.Field<string>("anotherfield")
         select new KeyValuePair<string, string>(o.Field<string>("field1"), 
             o.Field<string>("field2"))).ToList();

    View1.DataSource = new BindingSource(query, null);
    View1.DisplayMember = "Value";  
    View1.ValueMember = "Key";   
    View1.Refresh();

    View1.Combobox2SelectedIndex = -1;
}

Ora non ho accesso diretto alle caselle combinate.

    
posta Mohsen 09.04.2017 - 07:00
fonte

2 risposte

1

Ciò che chiami Presenter è in realtà la vista. La classe View separata che hai non è necessaria.

La vista prende i dati che ha a disposizione e li associa ai relativi elementi dell'interfaccia utente.

Ciò che un Presenter farebbe, se ne avesse uno, è presentare i dati in modo tale da poter essere facilmente associati alla Vista.

In MVP la vista sa che il presentatore e il presentatore conoscono il modello, ma il modello non conosce il presentatore e il presentatore non conosce la vista.

Questo è il presentatore:

    DataTable dt = Tools.GetDataTable("A Path");

    this.AProperty =
        (from o in dt.AsEnumerable()
         where o.Field<string>("afield") == 
             farmerView.Combobox1.SelectedValue.ToString()
         orderby o.Field<string>("anotherfield")
         select new KeyValuePair<string, string>(o.Field<string>("field1"), 
             o.Field<string>("field2"))).ToList();

Questa è la vista:

    this.DataSource = new BindingSource(presenter.AProperty, null);
    this.DisplayMember = "Value";  
    this.ValueMember = "Key";   
    this.Refresh();

    this.Combobox2SelectedIndex = -1;
    
risposta data 11.05.2017 - 09:30
fonte
0

Il tuo presentatore sta facendo troppo. Il tuo relatore non dovrebbe mai avere riferimenti per visualizzare le informazioni (in questo caso il controllo Casella combinata).

La vista è responsabile per ottenere informazioni dall'utente e quindi prendere il modello formattandolo per l'utente in base alla vista.

Il relatore prende informazioni dalla vista e fa qualcosa con essa. In questo caso ottieni alcuni dati. Questi dati devono essere restituiti alla vista in modo che possano presentarli su come la vista è corretta.

Il modello è l'informazione che viene passata avanti e indietro.

Quello che devi fare è fingere di non usarlo solo da un'applicazione Windows, ma devi anche usarlo come console. Dal momento che una console non avrà alcun riferimento a una combo-box, non è possibile averla nel tuo presentatore.

Dovresti leggere questo articolo sull'architettura . Si noti che l'interfaccia utente è sull'anello esterno. È necessario pensare all'interfaccia utente come intercambiabile. Se non è possibile cambiare l'interfaccia utente da una console, WPF, WinForms, servizio Web, sito Web, il presentatore è stato progettato in modo errato. È qui che entreranno in gioco i test unitari. Se collaudi il tuo presentatore, allora sarai costretto a implementarlo in un modo che lo rende intercambiabile.

    
risposta data 09.04.2017 - 19:34
fonte

Leggi altre domande sui tag