数据绑定WPF组合框不显示所选值

本文关键字:显示 WPF 组合 数据绑定 | 更新日期: 2023-09-27 18:09:54

我有一个ComboBox,绑定到一个数据表。ComboBox显示从DataTable的"wellId"列中提取的值列表。ComboBox也有样式,这样我就可以通过在DataTable中添加一个虚拟行,并将welid字段设置为"(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都不能正确显示选中的项目。而不是显示下拉列表中显示的相同值(来自数据表的"wellId"列),它只是显示字符串"System.Data.DataRowView"。无论我选择什么,它总是显示相同的内容。

如果我特别将组合框上的DisplayMemberPath设置为"wellId",那么它就会正确地显示选中的项目。但是,这会打乱我应用的所有其他样式,导致下拉列表被空白项填充。

如何使组合框正确显示所选项目?

数据绑定WPF组合框不显示所选值

将ComboBox设置为ItemTemplate而不是ItemContainerStyle,并删除IsEditable=True。如果IsEditable=True,那么SelectedItem将显示在一个文本框中,如果是一个文本框。文本绑定到一个项目,它将显示该项目的.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>