2010-07-15 2 views
9

Вопрос: Большинство образцов кода в DataGridComboBox, похоже, используют статический ресурс как ItemsSource. В моем случае использования я хотел бы предоставить различные ItemsSources каждому связанному объекту. Можно ли это сделать?Binding the ItemsSource для WPF DataGridComboBox Column

фон: Я пытаюсь связать коллекцию объектов класса Вопрос к в WPF DataGrid, с помощью элемента управления DataGridComboBoxColumn. Строка ответа предоставляет SelectedValue. Я хотел бы, чтобы список AnswerDomain предоставил ItemsSource для каждого ComboBox. 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> 

Проблема: Есть несколько проблем. Ключевая проблема сейчас заключается в том, что ComboBoxes в каждой строке 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

ответ

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 –

Смежные вопросы