2011-09-28 173 views
3

我有一个ComboBox,绑定到一个DataTable。 ComboBox显示从DataTable的“wellId”列中提取的值的列表。 ComboBox也是样式化的,这样我就可以简单地通过将wellId字段设置为“(设置)”的方式向DataTable添加虚拟行来将自定义项插入到列表中。数据绑定的WPF组合框不显示选定的值

<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”。无论我选择什么,它总是显示相同的东西。

如果我将组合框上的DisplayMemberPath专门设置为“wellId”,则它会正确显示所选项目。但是,这会混淆我应用的所有其他样式,导致下拉列表中填充空白条目。

如何让ComboBox正确显示所选项目?

回答

1

更改您的ComboBox以设置ItemTemplate而不是ItemContainerStyle,并删除IsEditable=True。如果IsEditable=True那么SelectedItem将得到显示在一个文本框,并且如果TextBox.Text绑定到一个项目时,会显示该项目

<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> 
+0

.ToString()有没有办法把它关闭而不删除IsEditable =真的吗?能够输入项目名称的一部分以在列表中找到它是我需要保留的。 – Nairou

+0

我决定采取另一条路线来解决这个问题。感谢您回答这个问题! – Nairou