WPF绑定ObservableCollection时如何自动选中DataGrid内ComboBox对应项
核心问题原因
你的ComboBox的ItemsSource返回的是status枚举类型的实例集合,而Record类中绑定到SelectedItem的Status属性是字符串类型,二者类型不匹配,WPF数据绑定无法自动完成值匹配,因此不能自动选中对应项。
除此之外还有两个隐含问题:你的TasksList目前是字段,WPF不支持绑定到公共字段,需要改为公共属性;同时前两列的DataGridTextColumn没有配置绑定,内容无法正常显示。
解决方案(两种可选)
方案1:修改Status属性类型为枚举(推荐,最简单)
XmlSerializer原生支持枚举类型的序列化/反序列化,存储时会自动保存为枚举值的字符串形式,反序列化时也能自动转换为枚举实例,完全兼容你现有的XML存储逻辑:
- 修改
Record类的Status属性类型:
public class Record { [XmlElement("Date")] public string Date { get; set; } [XmlElement("Description")] public string Description { get; set; } [XmlElement("Status")] // 把string改为status枚举类型 public status Status { get; set; } }
- 修改
TasksList为属性(修复绑定问题):
// 把字段改为公共属性 public ObservableCollection<Record> TasksList { get; set; } = new ObservableCollection<Record>();
- 修正XAML中DataGrid列的绑定配置,ComboBox的SelectedItem添加双向绑定:
<DataGrid x:Name="dg" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Date" Binding="{Binding Date}"></DataGridTextColumn> <DataGridTextColumn Header="Description" Binding="{Binding Description}"></DataGridTextColumn> <DataGridTemplateColumn Header="Status" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ComboBox Name="cb" SelectedItem="{Binding Path=Status, Mode=TwoWay}" SelectionChanged="cb_SelectionChanged" ItemsSource="{Binding Source={local:EnumBindingSourceExtention {x:Type local:status}}}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
方案2:保持Status为字符串类型,通过SelectedValue匹配
如果你不想修改现有实体类的属性类型,可以修改ComboBox的绑定逻辑,通过SelectedValue和SelectedValuePath完成字符串和枚举的匹配:
- 先完成方案1的第二步(把
TasksList改成属性)、第三步中给前两列加绑定的操作 - 仅修改ComboBox的绑定配置:
<ComboBox Name="cb" SelectedValue="{Binding Path=Status, Mode=TwoWay}" SelectedValuePath="." SelectionChanged="cb_SelectionChanged" ItemsSource="{Binding Source={local:EnumBindingSourceExtention {x:Type local:status}}}"/>
SelectedValuePath="."表示取枚举项本身的ToString值和绑定的Status字符串做匹配,即可完成自动选中。
两种方案任选其一都可以实现需求,修改后运行即可看到加载数据时ComboBox自动选中对应状态。
内容的提问来源于stack exchange,提问作者Myogeo
相关产品推荐
相关产品推荐

