天天看點

[WPF 如何] 如何向 ComboBox 添加一個空白選項

看到這個問題,你可能會蔑視一笑 : 這也能成文章?

确實,你隻需要在 ItemsSource 的0位置上插入一個空白的項就是了,如:

确實夠簡單,表現的很完美.

換成可空的資料源呢?

這樣寫很美完美啊!有什麼不對勁嗎?如果你說:對,很完美,那就該我蔑視你了!

沒有實踐就沒有"發鹽權", 本文就是說的這個東西.

上面的寫法看似很好,可是: 插入的空白項不能通過滑鼠選擇! 隻能通過鍵盤才能選擇.

具體為什麼, 我也說不出來個是以然來, 見招拆招,見廟拆廟而以, 不遇上它,我也不知道會有這一馬事.

說了這麼多廢話,到底有沒有解決辦法呢?

我試了 TargetNullValue, FallbackValue , 不過這兩個東西是為了解決顯示文本的問題的(不知道說的對不對),不信你可以試試, 它們跟本就沒用,依然無法用滑鼠去選擇.

用 CompositeCollection 混合集合

嗯, 這下可以選擇空白項了.

隻是選擇了空白項後, 接着還有問題 :  選擇空白項的時候,是不是會有個 紅框框 框住了這個 ComboBox ? 像這樣:

[WPF 如何] 如何向 ComboBox 添加一個空白選項

為什麼呢? 看到 SelectedItem 了沒有? 選擇的空白選項是個 ComboBoxItem 

System.Windows.Data Error: 23 : Cannot convert 'System.Windows.Controls.ComboBoxItem' from type 'ComboBoxItem' to type 'System.Nullable`1[AsNum.Aliexpress.Entity.LogisticsTypes]' for 'en-US' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: EnumConverter 無法從 System.Windows.Controls.ComboBoxItem 轉換。 在 System.ComponentModel.TypeConverter.GetConvertFromException(Object value) 在 System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 在 System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 在 System.ComponentModel.NullableConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 在 MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)' System.Windows.Data Error: 7 : ConvertBack cannot convert value 'System.Windows.Controls.ComboBoxItem' (type 'ComboBoxItem'). BindingExpression:Path=SelectedDeliveryType; DataItem='OrderQueryViewModel' (HashCode=10859455); target element is 'ComboBox' (Name=''); target property is 'SelectedItem' (type 'Object') NotSupportedException:'System.NotSupportedException: EnumConverter 無法從 System.Windows.Controls.ComboBoxItem 轉換。 在 MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward) 在 MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture) 在 System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

是的, 轉換為 SelectedItem 的時候失敗了.

疙瘩,一波未平一波又起. 是用 CompositeCollection 還是用 Insert ? 一個不能選擇空白項, 一個可以選, 但是選了也白選.

糾結,郁悶,沒人可以問, 我勸你牙的就别百度了, 百了也沒用 (好像根本就沒有相關的文章是中文的!這不能願百度). 

搜英文?怎麼組織關鍵詞? 算鳥, 即然這樣,就換個角度吧. 用 Insert 鐵定不行(别噴我噢,我确實沒有找出來可行的辦法), 用 CompositeCollection 很接近解決辦法了,隻是轉換的時候出了點小問題而以,不行就加個 Converter 呗.

記住一句話:不動手就沒發鹽權

一切不變,就是在 綁定 SelectedItem 的時候,加了一個 CanNullConverter 這個東西.

好拉,就這些.

謝謝圍觀.