C# 为ObservableCollection内的组合框创建事件(选中/未选中)
我是WPF&MVVM的新手,我在面板上有3个复选框项目,我需要每次用户单击其中一个时都会调用一个方法。此方法应检查3个复选框中每个复选框的状态(其中哪个复选框为“已选中”,哪个复选框为“未选中”),并使用此信息在文本块上显示一些文本。例如,如果所有3个选项都被选中,它将显示“A”,如果所有选项都未被选中,它将显示“B” 我有点复杂,希望你能帮我解决这个问题 这是XAML代码:C# 为ObservableCollection内的组合框创建事件(选中/未选中),c#,wpf,mvvm,C#,Wpf,Mvvm,我是WPF&MVVM的新手,我在面板上有3个复选框项目,我需要每次用户单击其中一个时都会调用一个方法。此方法应检查3个复选框中每个复选框的状态(其中哪个复选框为“已选中”,哪个复选框为“未选中”),并使用此信息在文本块上显示一些文本。例如,如果所有3个选项都被选中,它将显示“A”,如果所有选项都未被选中,它将显示“B” 我有点复杂,希望你能帮我解决这个问题 这是XAML代码: <StackPanel> <ItemsControl Margin="5" ItemsSour
<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
是多余的,因为这是默认值。我理解,谢谢!非常感谢你的快速回答!我正在检查它(为什么我不能在一个大编辑框中回复,为什么它会自动回复