Привязка ItemsSource для столбца WPF DataGridComboBox
вопрос: большинство образцов кода в DataGridComboBox, похоже, используют статический ресурс в качестве ItemsSource. В моем случае использования я хотел бы предоставить разные ItemsSources с каждым связанным объектом. можно ли это сделать?
фон: Я пытаюсь привязать коллекцию объектов класса вопросов к DataGrid WPF, используя элемент управления 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>
1 ответов
ваша проблема заключается в том, что путь элемента отображения не является ответом, потому что нет свойства "ответ" от строки. Я никогда не использую DataGridComboBoxColumn, это не кажется мне естественным, слишком похоже на старый способ win forms. Попробуйте вместо этого ниже. Но убедитесь, что вы реализуете 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));
}
}