WPF ComboBox使用ItemTemplate后选中项显示类名问题求解
问题根因
你写的ItemTemplate只会作用于ComboBox下拉展开的列表项,选中后顶部的选择展示区域默认不会套用这个模板。当前你手动绑定了Text属性但没有做正确的取值映射,框架找不到明确的显示文本时,会直接调用绑定实体的ToString()方法,最终就显示出了类的完整名称。
修复方法
给ComboBox加上TextSearch.TextPath附加属性,指定要显示的目标属性名即可,不需要改动你已经写好的DataTemplate,也不会影响属性变更通知的正常触发:
<ComboBox Name="cmbTiposComponentes" Width="150" TextSearch.TextPath="TipoComponente" ItemsSource="{Binding TiposComponentes}" ItemTemplate="{StaticResource ResourceKey=TipoComponenteTemplate}" SelectedItem="{Binding TiposComponentesSelectedItem}"> </ComboBox>
补充说明:
- 如果不需要ComboBox支持手动输入编辑,加上
IsEditable="False"即可,TextSearch.TextPath依然会正常控制选中项的显示文本 - 原先写的
Text="{Binding TiposComponentesTexto, UpdateSourceTrigger=PropertyChanged}"如果没有特殊业务需求建议直接删掉,避免和TextSearch的取值逻辑冲突。如果业务上必须保留这个绑定,只需要在TiposComponentesSelectedItem的setter里,同步把选中项的TipoComponente属性值赋值给TiposComponentesTexto就行。
修复后效果:
- 下拉列表项继续沿用你定义的DataTemplate渲染,实体属性变更时会自动更新显示
- 选中后顶部展示区域和下拉列表项显示完全一致的
TipoComponente属性值,不会再出现类名 - 开启可编辑模式时,输入的文本还会自动按照
TipoComponente属性做匹配检索
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

