2011-09-28 153 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