本帖最后由 u013837558 于 2014-03-21 23:37:20 编辑

解决方案 »

  1.   

     public class Myclass 
        {
            static CheckBox checkBox1 = new CheckBox();
            static CheckBox checkBox2 = new CheckBox();
            static CheckBox checkBox3 = new CheckBox();
            static CheckBox checkBox4 = new CheckBox();
            public int SelectedNumber  //只读属性
            {
                get
                {
                    return Myclass.Number();
                }
            }
            private static int Number()
            {
                int i = 0;
                bool?[] b = { checkBox1.IsChecked, checkBox2.IsChecked, checkBox3.IsChecked, checkBox4.IsChecked };
                foreach (bool? a in b)
                {
                    if (a == true)
                        i++;
                }
                return i;
            }
        }
      

  2.   


    public int SelectedNumber
    {
        get
        {
            return CheckBoxList.Sum(t=> t.IsChecked == true ? 1 : 0);
        }
    }CheckBoxList是CheckBox的集合。
      

  3.   

    首先,你需要确定ViewModel对象的数据结构。可以假定要将n个CheckBox绑定到DataContext的bool[]类型的一个叫做“开关”的属性上。定义了ViewModel的必要数据结构,就可以写View代码,例如
        <CheckBox Content="checkbox1" ...  IsChecked="{Binding 开关,Converter={StaticResource MyBoolArrayConverter},ConverterParameter=0}}"/>
    这里,参数ConverterParameter表示要将控件的IsChecked属性跟bool[]数组的哪一个下标的值绑定。最后,就是自己写一个ValueConverter(两三行代码而已),其Convert方法的value参数表示bool[]数组,parameter参数通过int.Parse((string)parameter)可得到要绑定的index。
      

  4.   

    关键是必须搞懂这样的语法 <CheckBox Content="checkbox1" ...  
              IsChecked="{Binding 开关,Converter={StaticResource MyBoolArrayConverter},ConverterParameter=0}}"/>搞不懂语法,就是瞎子摸象了,写出来的代码就是别的了。
      

  5.   

    我感觉是不是有点不妥呢,你这样写的话,要访问SelectedNumber属性才会得到其值的吧。因为我还有另外一个TextBlock控件,其Text属性是绑定到UserControl的SelectedNumber属性上的,你这样写的话,勾选CheckBox,TextBlock的Text属性会有更新吗?
      

  6.   

    MVVM模式下,实际上在编程中你根本不会去纠结什么控件!也就是说你根本不会去写 checkBox1、checkBox2...... 这种代码。反之,在你的数据处理代码中纠结到了控件,只是比较原始的那种写法。
      

  7.   


    不仅仅是控件的属性与数据模型进行(双向)绑定,就是Click事件等等也不应该写代码,而是使用配置的方式,例如写<i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <ei:CallMethodAction TargetObject="{Binding}" MethodName="刷新正在办任务"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>MVVM的重大意义在于,强调保证交互界面设计师反复、自由地调整设计体验的能力,避免被那些低级的代码绑架开发进度。因此,软件设计是配置方式的,而不是写代码的。代码是在预先按照设计和一定的接口要求(按照比较低级的文档要求)而写出来的。例如按照ValueConverter的要求、Behavior的要求、ViewModel数据处理(需要实现INotifyPropertyChanged借口)的要求、按照DependencyProperty的要求,等等要求来写代码。然后交互界面设计时可以反复、随便地运用这些代码来组合出程序设计。编写代码是低级的前期工作,程序设计的工作最终由界面设计师来完成。