我有一个ComboBox,绑定到DataTable。 ComboBox显示从DataTable的“wellId”列中提取的值列表。 ComboBox的样式也是这样我只需在DataTable中添加一个虚拟行并将wellId字段设置为“(settings)”即可将自定义项插入到列表中。
<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Content" Value="{Binding wellId}" />
<Style.Triggers>
<DataTrigger Binding="{Binding wellId}" Value="(settings)">
<Setter Property="Content" Value="Customize..." />
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
在大多数情况下,这很有效。它显示了列表,所有项目(包括虚拟项目)都可以在下拉列表中选择。
但是,从列表中选择项目后,无论是真实项目还是虚拟项目,ComboBox都不会正确显示所选项目。它不是显示下拉列表中显示的相同值(DataTable中的“wellId”列),而是显示字符串“ System.Data.DataRowView ”。无论我选择什么,它总是显示相同的东西。
如果我专门将ComboBox上的DisplayMemberPath设置为“wellId”,则它会正确显示所选项目。但是,这会混淆我应用的所有其他样式,导致下拉列表中填充空白条目。
如何让ComboBox正确显示所选项目?
答案 0 :(得分:1)
更改您的ComboBox以设置ItemTemplate
而不是ItemContainerStyle
,然后移除IsEditable=True
。如果IsEditable=True
则SelectedItem
将显示在TextBox中,如果TextBox.Text绑定到某个项目,则会显示该项目的.ToString()
<ComboBox Name="comboWell" ItemsSource="{Binding }">
<ComboBox.ItemTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="Content" Value="{Binding wellId}" />
<Style.Triggers>
<DataTrigger Binding="{Binding wellId}" Value="(settings)">
<Setter Property="Content" Value="Customize..." />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>