一、前言 在ComboBox中嵌入若幹個CheckBox時,當我們勾選一些CheckBox,ComboBox會顯示相應的勾選項。 例如:CheckBox項有A,B,C 那麼勾選這三項,ComboBox會顯示A,B,C 但有時候我們會發現,點擊CheckBox時,ComboBox會出現對象的名稱,而不 ...
一、前言
在ComboBox中嵌入若幹個CheckBox時,當我們勾選一些CheckBox,ComboBox會顯示相應的勾選項。
例如:CheckBox項有A,B,C 那麼勾選這三項,ComboBox會顯示A,B,C
但有時候我們會發現,點擊CheckBox時,ComboBox會出現對象的名稱,而不是我們想要的text
例如:CheckBox有三項A,B,C 它們的類型都是XModel類型,Text分別為A,B,C。 有時候ComboBox會顯示成"XModel"
為瞭解決這個問題,網上有這麼幾個方法,大多是重寫ComboBox:
1. https://www.codeproject.com/articles/563862/multi-select-combobox-in-wpf
2. http://blog.sina.com.cn/s/blog_7f83849b010164yp.html
但是這些方法太麻煩
二、示例
View部分:
<ComboBox Grid.Row="2"
Grid.Column="1" Margin="0" x:Name="checkedComboBox" IsEditable="True" IsReadOnly="True" ItemsSource="{Binding ModelTypes}" Text="{Binding Text,Mode=OneWay}" VerticalAlignment="Bottom" > <ComboBox.ItemTemplate> <DataTemplate DataType="{x:Type projectSetting:ModelType}"> <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox>
View的後臺部分:
checkedComboBox.DropDownClosed += CheckedComboBox_DropDownClosed; private void CheckedComboBox_DropDownClosed(object sender, System.EventArgs e) { BSViewModel vm = DataContext as BSViewModel; vm.UpdateText(); }
ViewModel部分:
public void UpdateText() { switch (CheckedRootModelTypes.Count) { case 0: Text = "<無>"; break; case 1: Text = CheckedRootModelTypes.First().Name; break; default: Text = string.Join(";", CheckedRootModelTypes.Select(x => x.Name).ToArray()); break; } RaisePropertyChanged(() => Text); }
也就是說在ComboBox的DropDownClose中實現viewmodel中的Text刷新操作即可。