2012-12-20 20 views
6

Mi sono guardato intorno, ho trovato alcune cose e ora sono bloccato su una casella combinata con due colonne visualizzate nell'area a discesa. Ho un tema xaml disponibile e la casella combinata "Stile" è definita e funziona bene come previsto, così che la parte è ok.WPF Style Combobox con due colonne nel menu a discesa

Ora ho una casella combinata di cui ho bisogno di visualizzare due valori, pensandoci come Abbreviazione Stato e Nome stato per il menu a discesa, proveniente da un'origine di associazione DataTable.DefaultView per gli articoli.

Se ho

<my:cboStates TextSearch.TextPath="StateAbbrev"> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" TextSearch.Text="{Binding Path=StateAbbrev}"> 
     <TextBlock Text="{Binding Path=StateAbbrev}"/> 
     <TextBlock Text="{Binding Path=FullStateName}" Margin="10 0"/> 
     </StackPanel> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</my:cboStates> 

questo funziona. Ora, come/dove sono bloccato ... Ora, voglio questa stessa funzionalità diciamo 5 diverse forme e tutte per avere lo stesso contenuto visualizzato, e se mai cambiato (non questo, ma per le altre caselle combinate a più colonne), Non voglio dover continuare a inserirlo direttamente nel file XAML del modulo.

Speravo di inserire nel file del dizionario delle risorse del tema e continuare a riutilizzare sempre questo "stile". Ha senso. Tuttavia, quando faccio, ed il legame è alla tabella di dati, gli unici risultati che si ottengono quando si cerca di fare come stile è discesa mostra valori di

System.Data.DataRowView 
System.Data.DataRowView 
System.Data.DataRowView 
System.Data.DataRowView 

invece delle attuali 2 colonne. Ecco cosa ho nel dizionario delle risorse "tema".

<DataTemplate x:Key="myStateComboTemplate" > 
    <StackPanel Orientation="Horizontal" > 
    <TextBlock Text="{Binding Path=StateAbbrev}"/> 
    <TextBlock Text="{Binding Path=FullStateName}"/> 
    </StackPanel> 
</DataTemplate> 

<Style x:Key="StyleMyStatesCombobox" TargetType="{x:Type ComboBox}" 
    BasedOn="{StaticResource MyOtherWorkingComboBoxStyle}" > 
    <Setter Property="TextSearch.TextPath" Value="{Binding Path=StateAbbrev}" /> 
    <Setter Property="ItemTemplate" Value="{StaticResource myStateComboTemplate}" /> 
</Style> 

Quindi, se ho due casi la mia classe "cboStates" creato sul form e impostare uno a uno stile esplicito elencato per primo, e il secondo in base all'impostazione "Style", il secondo fallisce di mostra solo le voci System.Data.DataRowView ripetute, non il contenuto dei dati effettivi.

Cosa mi manca.

Quindi, per chiarire quello che sto cercando ... Uniti ... ex dati

AL Alabama 
AK Alaska 
AZ Arizona 
AR Arkansas 
CA California 
CO Colorado 
CT Connecticut 
DE Delaware 

voglio la casella combinata al esporrà l'abbreviato AL, AK, AZ, ecc e più stretto casella combinata. Questo sarà ANCHE il "SelectedValue" al ritorno.

L'effettivo menu a discesa presenta i dati sopra elencati, mostrando ENTRAMBI l'abbreviazione E la lunga descrizione dello stato.

Esempio di casella combinata desiderata

enter image description here

+0

Qualsiasi motivo per cui non è possibile accoppiare i due insieme? Stavo pensando che potresti sempre provare a utilizzare una tupla, ma non sei sicuro di come funzionerebbe. –

+0

@Bob, considerato Tuple, ma questo era solo un esempio semplificato di ciò che verrà popolato in una casella combinata che chiunque potrebbe capire. In realtà avrò una varietà di combobox simili che avranno dati provenienti da tabelle e potrebbero variare, quindi non valori fissi. Non volevo interrogare il database, quindi collegarlo e inserirmi in un'altra tupla di memoria solo per ri-analizzare chiave/valore/valore alt/chiave extra, ecc., Se necessario, dalla presentazione della combobox del risultato. – DRapp

+0

Che dire di un 'Dictionary '? Collega la chiave 'a un' TextBlock' e 'Value' all'altro' TextBlock'? O ci sono più possibili più di due file? –

risposta

0

finalmente riusciti a farlo funzionare ... e per coloro che tentano simili. Dato che stavo cercando di avere un'istanza di "classe" standard che potesse essere utilizzata in tutto, ma non volendo esplicitamente fare riferimento all'XAML in ogni pagina, una parte dello stile doveva essere gestita durante l'istanza della classe in-code effettiva.

Dal momento che non so esattamente come/quando il framework .net costruisce tutti i suoi controlli, le impostazioni di stile, ecc., Mi sentivo frustrato dal fatto che avrebbe funzionato se diretto da xaml, ma falliva quando nel codice. Così, ho finito per forzare i valori del modello dell'articolo AND TextSearch.TextPath nel codice. Ecco un breve snippet della classe

public class myStatesCombo : ComboBox 
{ 
    public myStatesCombo() 
    { 
     Loaded += myAfterLoaded; 
    } 

    protected static DataTable myTableOfStates; 

    public void myAfterLoaded() 
    { 
     if(myTableOfStates == null) 
     myTableOfStates = new DataTable(); 

     CallProcedureToPopulateStates(myTableOfStates); 

     ItemsSource = myTableOfStates.DefaultView; 

     // AFTER the object is created, and all default styles attempted to be set, 
     // FORCE looking for the resource of the "DataTemplate" in the themes.xaml file 
     object tryFindObj = TryFindResource("myStateComboTemplate"); 
     if(tryFindObj is DataTemplate) 
     ItemTemplate = (DataTemplate)tryFindObj; 

     // NOW, the CRITICAL component missed in the source code 
     TextSearch.SetTextPath(this, "StateAbbrev"); 
    } 
} 

Ora, una nota speciale.Nella routine che usavo per compilare il DataTable, pre-controllo se la tabella esiste o meno. La prima volta in, creo il tavolo. Se ho bisogno di ri-popolarlo, se continuo a fare una "nuova DataTable" ogni volta, spazza via i binding del modello data/item. Per evitare questo, vorrei poi fare

if(myTableOfStates.Rows.Count > 0) 
    myTableOfStates.Rows.Clear(); 

ALLORA, mi chiamo il mio

SQLExecute chiamata per interrogare dal database (DataAdapter) e Fill() datatable.

Quindi, ora tutto sembra popolato correttamente, i collegamenti per la visualizzazione e la ricerca di testi sono completi e pronti all'uso.