首页 > 代码库 > 【MVVM Dev】ComboBox嵌入CheckBox的显示问题

【MVVM Dev】ComboBox嵌入CheckBox的显示问题

一、前言

       在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刷新操作即可。

【MVVM Dev】ComboBox嵌入CheckBox的显示问题