2010-07-15 8 views
9

Domanda: la maggior parte degli esempi di codice su DataGridComboBox sembra utilizzare una risorsa statica come ItemsSource. Nel mio caso d'uso, mi piacerebbe fornire diversi ItemsSources con ciascun oggetto associato. Questo può essere fatto?Binding the ItemsSource per una colonna WPF DataGridComboBox

Sfondo: Sto cercando di legare una collezione di oggetti di classe domanda a un WPF DataGrid, utilizzando un controllo DataGridComboBoxColumn. La stringa di risposta fornisce il valore selezionato. Mi piacerebbe che l'elenco AnswerDomain fornisse gli ItemsSource per ogni ComboBox. AnswerDomain differisce da domanda a domanda.

Classe

public class Question 
    { 
    string Answer {get; set;} 
    List<string> AnswerDomain {get; set;} 
    //...other stuff 
    } 

XAML

<DataGrid ItemsSource="{Binding Path=InspectionItems}" AutoGenerateColumns="False" Name="dataGrid1" > 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn Header="Answer Domain" 
           DisplayMemberPath="Answer" 
           SelectedValuePath="Answer" 
           ItemsSource="{Binding Path=AnswerDomain}" 
            > 
     </DataGridComboBoxColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Problema: Ci sono un paio di problemi. Il problema chiave in questo momento è che i ComboBox in ciascuna riga DataGrid non visualizzano le stringhe AnswerDomain. Ho provato una serie di combinazioni XAML senza successo. Aiutami Stack Overflow.

UPDATE: La soluzione selezionata sotto funzionava. Dopo un po 'di confusione e aggiungendo UpdateSourceTrigger=PropertyChanged a SelectedItem, le modifiche dell'utente nella casella combinata sono state quindi riflesse nell'oggetto personalizzato sottostante.

<DataGridTemplateColumn Header="Answer"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox 
       ItemsSource="{Binding AnswerDomain}" 
       SelectedItem="{Binding Answer, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

Questa risposta spiega il motivo per cui non è possibile associare DataGridComboBoxColumn ad una dinamica vincolante - http://stackoverflow.com/a/5411157/158675 – Edward

risposta

10

Il tuo problema è che il percorso non è membro del display risposta perché non esiste una proprietà "Risposta" fuori di una stringa. Non uso mai DataGridComboBoxColumn, non mi sembra naturale, troppo simile alla vecchia modalità di vincere. Prova invece il sotto. MA ASSICURATI DI IMPLEMENTARE InotifyPropertyChanged sulla tua classe di domande e attiva gli eventi appropriati.

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding AnswerDomain}" SelectedItem="{Binding Answer}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Ecco come la classe domanda dovrebbe essere:

public class Question : INotifyPropertyChanged 
{ 
    private string m_Answer; 
    public string Answer 
    { 
     get { return m_Answer; } 
     set 
     { 
      if (m_Answer != value) 
      { 
       m_Answer = value; 
       FirePropertyChanged("Answer"); 
      } 
     } 
    } 

    private List<string> m_AnswerDomain; 
    public List<string> AnswerDomain 
    { 
     get { return m_AnswerDomain; } 
     set 
     { 
      if (m_AnswerDomain != value) 
      { 
       m_AnswerDomain = value; 
       FirePropertyChanged("AnswerDomain"); 
      } 
     } 
    } 


    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void FirePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 


} 
+0

Grazie , @viggity. Questo fa il trucco. Stranamente, anche con l'implementazione di INPC, sto riscontrando dei problemi nel far sì che le modifiche all'interfaccia utente si riflettano nella raccolta di oggetti associati, ma suppongo che si tratti di un problema diverso. Grazie ancora. -Wen –