2010-07-15 82 views
9

問題:DataGridComboBox上的大多數代碼示例似乎都使用靜態資源作爲ItemsSource。在我的用例中,我想爲每個綁定對象提供不同的ItemsSources。 可以這樣做嗎?綁定WPF DataGridComboBox的ItemsSource列

背景:我試圖綁定問題類對象的WPF的DataGrid的收集,使用DataGridComboBoxColumn控制。答案字符串提供了SelectedValue。我希望AnswerDomain列表爲每個ComboBox提供ItemsSource。 AnswerDomain因問題而異。

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> 

問題:有幾個問題。現在的關鍵問題是每個DataGrid行中的組合框都不顯示AnswerDomain字符串。我嘗試了一系列XAML組合,但沒有成功。幫助我堆棧溢出。

更新:下面選定的解決方案工作。在進一步摸索之後,通過將UpdateSourceTrigger=PropertyChanged添加到SelectedItem中,組合框中的用戶更改會反射回底層的自定義對象中。

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

這個答案解釋了爲什麼你不能綁定DataGridComboBoxColumn的動態綁定 - http://stackoverflow.com/a/5411157/158675 – Edward 2013-06-11 18:55:13

回答

10

您的問題是,顯示成員路徑不是答案,因爲沒有「應答」屬性的字符串。我從來沒有使用DataGridComboBoxColumn,這對我來說似乎不太自然,太像舊的勝利形式的方式。改爲嘗試下面的內容。但要確保你在你的問題類上實施了INotifyPropertyChanged,並且發起適當的事件。

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

這裏是你的問題類應該是什麼樣子:

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

謝謝,@viggity。這就是訣竅。奇怪的是,即使實施了INPC,我也遇到了一些麻煩,讓用戶界面的變化反射回綁定的對象集合中,但我想這是一個不同的問題。再次感謝。 -Wen – 2010-07-16 15:44:41

相關問題