2010-10-26 21 views
5

Ciao a tutti
Ho una casella combinata che è un database per un elenco di elementi. Ma oltre a quella lista di elementi, voglio avere un altro oggetto. Questo articolo dovrebbe visualizzare il testo 'Nuovo ...'
L'idea è se selezionano uno degli elementi normali, esegue un'azione che coinvolge quell'elemento. Se selezionano l'elemento 'Nuovo', li porteranno su una schermata in cui possono creare un nuovo elemento.
Il problema è che quando si DataBind qualcosa che non ottenere la possibilità di aggiungere un altro elemento ad esso, e non v'è alcun dubbio di aggiungere un elemento fittizio all'elenco degli elementi ...ComboBox Databound WPF con elemento 'Nuovo ...'

È questo l'opportunità di creare un nuovo controllo basato sul ComboBox che ha una proprietà 'DefaultElement'? (con tutto il relativo collegamento di template e comandi, ecc.)

risposta

5

Per fare ciò ho creato in precedenza una classe di wrapper fittizio per il tipo normale, che consente di eseguire il binding a un elenco contenente principalmente i valori corretti e anche il "Nuovo". .. "uno, ad es

public class DisplayClass 
{ 
    public DisplayClass(ModelClass mc) 
    { 
     this.mc = mc; 
    } 

    public string Name 
    { 
     get { return this.mc != null ? this.mc.Name : "New..."; } 
    } 

    public bool IsDummy 
    { 
     return this.mc == null; 
    } 

    public ModelClass Model 
    { 
     return this.mc; 
    } 
} 

si può quindi ospitare una collezione di questi nel vostro contesto dati (ViewModel), e gestire la selezione in modo appropriato sulla base di IsDummy. Non è automatico come un controllo con questa funzionalità integrata, ma è piuttosto semplice e potrebbe essere facilmente reso generico e quindi riutilizzabile.

+0

Questo sembra realizzare i miei criteri ... E 'difficile dal momento che la vostra e le risposte di VC sono essenzialmente la stessa, ma mi prendo questa volta dal momento che ha un esempio – TerrorAustralis

+0

Nessun problema, felice di vedere che hai trovato una risposta –

2

Ricordare che ciò a cui si associa è una raccolta di elementi orientata all'interfaccia utente che può essere diversa dall'azienda o dalle entità di dati.

Se fossi in te, mi piacerebbe inserire un 'nuovo' entità nella prima posizione della raccolta legato e rilevare nel mio ViewModel per innescare l'azione appropriata quando l'utente lo seleziona.

3

Impostare la proprietà ItemsSource su CompositeCollection con il nuovo elemento e la raccolta associata insieme, quindi rilevare la selezione di quell'elemento in base all'indice selezionato o qualcosa di simile.

Esempio di codice:

<ComboBox> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
     <ComboBoxItem>Add New Item...</ComboBoxItem> 
     <CollectionContainer Collection="{Binding Source={StaticResource CollectionSource}}"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

MSDN per CompositeCollection: http://msdn.microsoft.com/en-us/library/system.windows.data.compositecollection(v=vs.110).aspx

+0

Ottima risposta. Grazie. –