这让我发疯了。我有一个DataGrid,它有一个DataGridComboBoxColumn,我希望用户可以使用它来进行选择。这是我网格的基本轮廓。
<DataGrid ItemsSource="{Binding GoalList}" DockPanel.Dock="Bottom" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{Binding LifeAreaList}" Header="Life Area"/>
<DataGrid.Columns>
</DataGrid>
DataGrid绑定到Goal类型的对象集合。每个目标都有一个LifeArea类型的属性。每个LifeArea都具有LifeAreaId和Name。
属性数据上下文包含一个可观察的目标集合:目标列表和生命区域列表:LifeAreaList。我希望用户能够为目标选择不同的生活区域。生命区域的名称也必须是显示的值。
修改
解决方案是必须将DataGridComboBoxColumn的ItemsSource设置为静态资源。另一种选择是通过代码设置ItemsSource。
最后我有:
<DataGridComboBoxColumn x:Name="_lifeAreaComboBoxColumn" SelectedItemBinding="{Binding LifeArea}" DisplayMemberPath="Name" Header="Life Area">
在后面的代码中我设置了ItemsSource:
_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();
当我有机会时,我会将其转换为StaticResource。
答案 0 :(得分:22)
你需要做这样的事情(不要射击信使):
<DataGridComboBoxColumn Header="Life Area" SelectedItemBinding="{Binding SelectedLifeArea}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
答案 1 :(得分:1)
除了绑定您的SelectedItem之外,我猜测您的SelectedLifeArea属性不是直接从LifeAreaList获取的,因此在比较这两个值时,即使名称和ID匹配,它们也会返回false。您可能需要覆盖LifeArea对象的.Equals函数,以便在两个对象的ID匹配时返回true
public override bool Equals(object obj)
{
if (obj is LifeArea)
{
return this.Id == (obj as LifeArea).Id;
}
return false;
}
答案 2 :(得分:1)
Up也可以使用DataGridTemplateColumn,只需在其中放入一个ComboBox,然后将相应的事件连接到它。
<DataGridTemplateColumn Header="Alpha">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="models:MyModelDescription">
<ComboBox ItemsSource="{Binding AlphaLevels, Mode=OneWay}" SelectedItem="{Binding Alpha, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>