我有两个checkboxes
。当我检查一个时,我希望另一个取消选中当前是否已检查。两者都可以不受控制。目前,我可以检查一个,但当我检查另一个时,两个都取消选中。我无法弄清楚原因。
注意:如果可能,我想在.xaml中完成所有操作。到目前为止,我一直在搞乱数据触发器以获得正确的效果而没有运气。
<CheckBox Name="SYOChkBox">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=UTMChkBox}"
Value="True">
<Setter Property="IsChecked"
Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<CheckBox Name="UTMChkBox">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=SYOChkBox}"
Value="True">
<Setter Property="IsChecked"
Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
答案 0 :(得分:3)
您应该 真的 使用ViewModel
来执行此操作(我将留下一段代码,说明如何使用VM完成此操作的帖子)。
无论如何,这是我只能用XAML做的事情
使用这种方法的问题是,当两者都被选中时,两个触发器都将被触发(??),并且两者都将被取消选中。所以,我猜你能做的就是:
检查CheckBox X
时, CheckBox Y
通常会取消选中,CheckBox X
只检查CheckBox Y
时不会检查。
<CheckBox Name="SYOChkBox">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsChecked, ElementName=UTMChkBox}" Value="True" />
<Condition Binding="{Binding IsChecked, ElementName=SYOChkBox}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="IsChecked" Value="False" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<CheckBox Name="UTMChkBox" />
我知道这不是你问的问题,但作为一种消化,你可以使用RadioButton
,代码会更清晰:
<RadioButton>Option A</RadioButton>
<RadioButton>Option B</RadioButton>
<RadioButton>None</RadioButton>
ViewModel
<CheckBox IsChecked="{Binding IsChecked_CheckBoxA}" />
<CheckBox IsChecked="{Binding IsChecked_CheckBoxB}" />
private bool _IsChecked_CheckBoxA;
private bool _IsChecked_CheckBoxB;
public bool IsChecked_CheckBoxA
{
get
{
return _IsChecked_CheckBoxA;
}
set
{
if (value)
IsChecked_CheckBoxB = false;
_IsChecked_CheckBoxA = value;
NotifyPropertyChanged();
}
}
public bool IsChecked_CheckBoxB
{
get
{
return _IsChecked_CheckBoxB;
}
set
{
if (value)
IsChecked_CheckBoxA = false;
_IsChecked_CheckBoxB = value;
NotifyPropertyChanged();
}
}
答案 1 :(得分:1)
正如其他人所说,它可能不仅仅在xaml中可行,并且建议使用viewmodel。所以这就是我的工作:
的Xaml:
<CheckBox Name="SYOChkBox"
IsChecked="{Binding IsCheckedSYO}" />
<CheckBox Name="UTMChkBox"
IsChecked="{Binding IsCheckedUTM}" />
视图模型:
private bool _isCheckedSYO;
public bool IsCheckedSYO
{
get { return _isCheckedSYO; }
set
{
if (true == value) //if checked
{
IsCheckedUTM = false; //uncheck the UTM check box
_isCheckedSYO = value;
}
else
{
_isCheckedSYO = value;
}
OnPropertyChanged("IsCheckedSYO");
}
}
private bool _isCheckedUTM;
public bool IsCheckedUTM
{
get { return _isCheckedUTM; }
set
{
if (true == value) //if checked
{
IsCheckedSYO = false; //uncheck the SYO checkbox
_isCheckedUTM = value;
}
else
{
_isCheckedUTM = value;
}
OnPropertyChanged("IsCheckedUTM");
}
}