zoukankan      html  css  js  c++  java
  • 【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刷新操作即可。

  • 相关阅读:
    修改input:file样式
    gruntjs
    C#Lambda表达式
    C#委托与事件讲解(一)
    Linq的语法以及常用的扩展方法
    正则表达式就这么简单!
    C#参考之sealed密封类(转)
    Python学习(六)
    Python学习(一)
    自动化测试之JDBC连接、分布式负载
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/6917826.html
Copyright © 2011-2022 走看看