了解绑定 DataGridComboBoxColumn Itemssource 和 SelectedItem
Understand Binding DataGridComboBoxColumn Itemssource and SelectedItem
我不明白如何正确绑定到 DataGridComboBoxColumn。
我的 DataGrid TextColum 显示来自我的 RowEntries 的值,但 ComboBoxColumn 未填充。
我有一个名为 RowEntries 的 RowEntryView 的 ObservableCollection,它是派生的:
public class DataTypes : RowEntryView
{
private string _value;
public string[] ValuesPossible {get; set; }
public string Value
{
get
{
return _value;
}
set
{
_value = value;
OnPropertyChanged(new PropertyChangedEventArgs("Value"));
}
}
}
我的 DatagridTextColum 显示 Value 变量。我的 DataGridComboBoxColumn 是空白的。 Values possible 填充为{"A", "B", "C"}, Value 填充为"A"
<DataTemplate x:Name="myDataTemplate">
<DataGrid RowHeight="30" VerticalContentAlignment="Center" x:Name="myDataGridMain" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding RowEntries}" >
<DataGrid.Columns>
<DataGridTextColumn Width="4*" IsReadOnly="True" x:Name="dataGridColumnDescription" Header="Value" Binding="{Binding Value}">
</DataGridTextColumn>
<DataGridComboBoxColumn Header="Type" ItemsSource="{Binding ValuesPossible}" SelectedItemBinding="{Binding Value}"></DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
ItempsSource 是您希望显示的项目列表。 SelectedItem(不是 selectedItemBinding)是您选择的对象。基本上你需要有 SelectedItem="{Binding Value}"。
现在,为了能够通知您有关每个新选择的更改的数据上下文,您的对象必须实现 INotifyPropertyChanged 然后您的绑定将变为:
SelectedItem="{绑定值,UpdateSourceTrigger=PropertyChanged,模式=TwoWay}"。
你会在网上找到很多例子。
那么我建议使用 DataGridTemplateColumn:
<DataGridTemplateColumn Header="Type">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ValuesPossible}"
SelectedItem="{Binding Value, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我不明白如何正确绑定到 DataGridComboBoxColumn。 我的 DataGrid TextColum 显示来自我的 RowEntries 的值,但 ComboBoxColumn 未填充。
我有一个名为 RowEntries 的 RowEntryView 的 ObservableCollection,它是派生的:
public class DataTypes : RowEntryView
{
private string _value;
public string[] ValuesPossible {get; set; }
public string Value
{
get
{
return _value;
}
set
{
_value = value;
OnPropertyChanged(new PropertyChangedEventArgs("Value"));
}
}
}
我的 DatagridTextColum 显示 Value 变量。我的 DataGridComboBoxColumn 是空白的。 Values possible 填充为{"A", "B", "C"}, Value 填充为"A"
<DataTemplate x:Name="myDataTemplate">
<DataGrid RowHeight="30" VerticalContentAlignment="Center" x:Name="myDataGridMain" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding RowEntries}" >
<DataGrid.Columns>
<DataGridTextColumn Width="4*" IsReadOnly="True" x:Name="dataGridColumnDescription" Header="Value" Binding="{Binding Value}">
</DataGridTextColumn>
<DataGridComboBoxColumn Header="Type" ItemsSource="{Binding ValuesPossible}" SelectedItemBinding="{Binding Value}"></DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
ItempsSource 是您希望显示的项目列表。 SelectedItem(不是 selectedItemBinding)是您选择的对象。基本上你需要有 SelectedItem="{Binding Value}"。 现在,为了能够通知您有关每个新选择的更改的数据上下文,您的对象必须实现 INotifyPropertyChanged 然后您的绑定将变为: SelectedItem="{绑定值,UpdateSourceTrigger=PropertyChanged,模式=TwoWay}"。 你会在网上找到很多例子。
那么我建议使用 DataGridTemplateColumn:
<DataGridTemplateColumn Header="Type">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ValuesPossible}"
SelectedItem="{Binding Value, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>