C# 为ObservableCollection内的组合框创建事件(选中/未选中)

C# 为ObservableCollection内的组合框创建事件(选中/未选中),c#,wpf,mvvm,C#,Wpf,Mvvm,我是WPF&MVVM的新手,我在面板上有3个复选框项目,我需要每次用户单击其中一个时都会调用一个方法。此方法应检查3个复选框中每个复选框的状态(其中哪个复选框为“已选中”,哪个复选框为“未选中”),并使用此信息在文本块上显示一些文本。例如,如果所有3个选项都被选中,它将显示“A”,如果所有选项都未被选中,它将显示“B” 我有点复杂,希望你能帮我解决这个问题 这是XAML代码: <StackPanel> <ItemsControl Margin="5" ItemsSour

我是WPF&MVVM的新手,我在面板上有3个复选框项目,我需要每次用户单击其中一个时都会调用一个方法。此方法应检查3个复选框中每个复选框的状态(其中哪个复选框为“已选中”,哪个复选框为“未选中”),并使用此信息在文本块上显示一些文本。例如,如果所有3个选项都被选中,它将显示“A”,如果所有选项都未被选中,它将显示“B”

我有点复杂,希望你能帮我解决这个问题

这是XAML代码:

<StackPanel>
    <ItemsControl Margin="5" ItemsSource="{Binding Path=CheckBoxCollection, Mode=TwoWay}" >
         <ItemsControl.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding Path=CheckBoxValue, Mode=TwoWay}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

    <TextBlock>Result Here</TextBlock>
</StackPanel>
public class CheckBoxValue
{
    bool _theValue;

    public bool theValue
    {
        get
        {
            return _theValue;
        }

        set
        {
            _theValue = value;
        }
    }
}

public class myViewModel : ViewModelBase
{
    public ObservableCollection<CheckBoxValue> CheckBoxCollection { get; set; }

    public myViewModel( Some Parameters.... )
    {
        CheckBoxCollection = new ObservableCollection<CheckBoxValue>();

        CheckBoxCollection.Add(new CheckBoxValue { theValue = false });
        CheckBoxCollection.Add(new CheckBoxValue { theValue = false });
        CheckBoxCollection.Add(new CheckBoxValue { theValue = false });

        base.RaisePropertyChanged( () => CheckBoxCollection );
    }
}

结果在这里
以下是隐藏的代码:

<StackPanel>
    <ItemsControl Margin="5" ItemsSource="{Binding Path=CheckBoxCollection, Mode=TwoWay}" >
         <ItemsControl.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding Path=CheckBoxValue, Mode=TwoWay}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

    <TextBlock>Result Here</TextBlock>
</StackPanel>
public class CheckBoxValue
{
    bool _theValue;

    public bool theValue
    {
        get
        {
            return _theValue;
        }

        set
        {
            _theValue = value;
        }
    }
}

public class myViewModel : ViewModelBase
{
    public ObservableCollection<CheckBoxValue> CheckBoxCollection { get; set; }

    public myViewModel( Some Parameters.... )
    {
        CheckBoxCollection = new ObservableCollection<CheckBoxValue>();

        CheckBoxCollection.Add(new CheckBoxValue { theValue = false });
        CheckBoxCollection.Add(new CheckBoxValue { theValue = false });
        CheckBoxCollection.Add(new CheckBoxValue { theValue = false });

        base.RaisePropertyChanged( () => CheckBoxCollection );
    }
}
公共类CheckBoxValue
{
布尔值;
公共资产价值
{
得到
{
返回值;
}
设置
{
_价值=价值;
}
}
}
公共类myViewModel:ViewModelBase
{
公共ObservableCollection CheckBoxCollection{get;set;}
公共myViewModel(某些参数…)
{
CheckBoxCollection=新的ObservableCollection();
Add(新的CheckBoxValue{theValue=false});
Add(新的CheckBoxValue{theValue=false});
Add(新的CheckBoxValue{theValue=false});
base.RaisePropertyChanged(()=>CheckBoxCollection);
}
}

我会更进一步,为所有类型的“可选”对象定义一个可重用的ViewModel:

XAML:



}

我会更进一步,为所有类型的“可选”对象定义一个可重用的ViewModel:

XAML:



}我可能对此做了太多更改,但这可能是更简单的方法

<StackPanel>
 <CheckBox IsChecked="{Binding Path=CheckBoxValue1, Mode=TwoWay}" />
 <CheckBox IsChecked="{Binding Path=CheckBoxValue2, Mode=TwoWay}" />
 <CheckBox IsChecked="{Binding Path=CheckBoxValue3, Mode=TwoWay}" />


 <TextBlock>
  <TextBlock.Text>
   <Binding Path="StringValue" UpdateSourceTrigger="PropertyChanged" />
  </TextBlock.Text>
 </TextBlock>
</StackPanel>





#region properties
    string stringValue;
    public StringValue
    {
    get {return stringValue;}
    set 
    {
     stringValue = value;
     OnPropertyChanged("StringValue");
    }

    }
    bool checkBoxValue1;
    public bool CheckBoxValue1
    {
        get{ return checkBoxValue1; }
        set
        {
             checkBoxValue1= value;
             ChangedValue();
        }
    }
    bool checkBoxValue2;
    public bool CheckBoxValue2
    {
        get{ return checkBoxValue2; }
        set
        {
             checkBoxValue2 = value;
             ChangedValue();
        }
    }
    bool checkBoxValue3;
    public bool CheckBoxValue3
    {
        get{ return checkBoxValue3; }
        set
        {
             checkBoxValue3 = value;
             ChangedValue();
        }
    }
#endregion

public class myViewModel : ViewModelBase
{


    public myViewModel( Some Parameters.... )
    {
        checkBoxValue1 = false;
        checkBoxValue2 = false;
        checkBoxValue3 = false;
        StringValue = b;

    }
    public void ChangedValue()
    {
      if (checkBoxValue1 && checkBoxValue2 && checkBoxValue3)
      {
          StringValue = a
      }
      else
      {
          StringValue = b
      }
    }
}

#区域属性
字符串字符串值;
公共价值
{
获取{return stringValue;}
设置
{
stringValue=值;
OnPropertyChanged(“StringValue”);
}
}
bool checkBoxValue1;
public bool CheckBoxValue1
{
获取{return checkBoxValue1;}
设置
{
checkBoxValue1=值;
ChangedValue();
}
}
bool checkBoxValue2;
公共布尔CheckBoxValue2
{
获取{return checkBoxValue2;}
设置
{
checkBoxValue2=值;
ChangedValue();
}
}
bool checkBoxValue3;
公共布尔CheckBoxValue3
{
获取{return checkBoxValue3;}
设置
{
checkBoxValue3=值;
ChangedValue();
}
}
#端区
公共类myViewModel:ViewModelBase
{
公共myViewModel(某些参数…)
{
checkBoxValue1=假;
checkBoxValue2=假;
checkBoxValue3=假;
StringValue=b;
}
public void ChangedValue()
{
如果(checkBoxValue1&&checkBoxValue2&&checkBoxValue3)
{
StringValue=a
}
其他的
{
StringValue=b
}
}
}

很抱歉,这是一种拼凑,但希望你能理解我的想法,我可能改变得太多了,但这可能是更简单的方法

<StackPanel>
 <CheckBox IsChecked="{Binding Path=CheckBoxValue1, Mode=TwoWay}" />
 <CheckBox IsChecked="{Binding Path=CheckBoxValue2, Mode=TwoWay}" />
 <CheckBox IsChecked="{Binding Path=CheckBoxValue3, Mode=TwoWay}" />


 <TextBlock>
  <TextBlock.Text>
   <Binding Path="StringValue" UpdateSourceTrigger="PropertyChanged" />
  </TextBlock.Text>
 </TextBlock>
</StackPanel>





#region properties
    string stringValue;
    public StringValue
    {
    get {return stringValue;}
    set 
    {
     stringValue = value;
     OnPropertyChanged("StringValue");
    }

    }
    bool checkBoxValue1;
    public bool CheckBoxValue1
    {
        get{ return checkBoxValue1; }
        set
        {
             checkBoxValue1= value;
             ChangedValue();
        }
    }
    bool checkBoxValue2;
    public bool CheckBoxValue2
    {
        get{ return checkBoxValue2; }
        set
        {
             checkBoxValue2 = value;
             ChangedValue();
        }
    }
    bool checkBoxValue3;
    public bool CheckBoxValue3
    {
        get{ return checkBoxValue3; }
        set
        {
             checkBoxValue3 = value;
             ChangedValue();
        }
    }
#endregion

public class myViewModel : ViewModelBase
{


    public myViewModel( Some Parameters.... )
    {
        checkBoxValue1 = false;
        checkBoxValue2 = false;
        checkBoxValue3 = false;
        StringValue = b;

    }
    public void ChangedValue()
    {
      if (checkBoxValue1 && checkBoxValue2 && checkBoxValue3)
      {
          StringValue = a
      }
      else
      {
          StringValue = b
      }
    }
}

#区域属性
字符串字符串值;
公共价值
{
获取{return stringValue;}
设置
{
stringValue=值;
OnPropertyChanged(“StringValue”);
}
}
bool checkBoxValue1;
public bool CheckBoxValue1
{
获取{return checkBoxValue1;}
设置
{
checkBoxValue1=值;
ChangedValue();
}
}
bool checkBoxValue2;
公共布尔CheckBoxValue2
{
获取{return checkBoxValue2;}
设置
{
checkBoxValue2=值;
ChangedValue();
}
}
bool checkBoxValue3;
公共布尔CheckBoxValue3
{
获取{return checkBoxValue3;}
设置
{
checkBoxValue3=值;
ChangedValue();
}
}
#端区
公共类myViewModel:ViewModelBase
{
公共myViewModel(某些参数…)
{
checkBoxValue1=假;
checkBoxValue2=假;
checkBoxValue3=假;
StringValue=b;
}
public void ChangedValue()
{
如果(checkBoxValue1&&checkBoxValue2&&checkBoxValue3)
{
StringValue=a
}
其他的
{
StringValue=b
}
}
}

很抱歉,这是一个很复杂的问题,但希望您能理解

非常感谢您的快速回答!我正在检查它(为什么我不能在一个大编辑框中回复,为什么当我点击“回车”时它会自动发送我的消息?这很奇怪)为什么即使在刷新页面时我也不能在主论坛页面上看到我的问题?()HighCore,实际上为什么我需要“T型”属性?我禁用了它,将“Model=“CheckBox1”更改为“IsSelected=false”,并在xaml中更改为“”。。。它工作得很好,我使用OnCheckBoxSelectionChanged()方法,可以检查列表中每个复选框的状态:-)@John我的解决方案更具可伸缩性,因为它不仅可以用于此复选框,还可以用于任何类型的可选内容。而且功能也更丰富,因为有了
T
模型,您实际上可以使用它来显示
列表框中的
Person
对象等。正如我之前告诉过你的,将
IsSelected
设置为
false
是多余的,因为这是默认值。我理解,谢谢!非常感谢你的快速回答!我正在检查它(为什么我不能在一个大编辑框中回复,为什么它会自动回复