C++【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();
  }

C++, 

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