我有3个复选框。让我们称呼他们cb1
,cb2
和cb3
。选中cb3
和cb1
时,应检查cb2
。我如何在WPF中实现它。我是WPF的新手。
提前谢谢。
答案 0 :(得分:4)
如果您使用的是ViewModel,只需添加一个新的计算属性即可。
简单的视图模型如下所示:
public class MyVieWModel : INotifyPropertyChanged
{
private bool _cb1Checked;
private bool _cb2Checked;
public bool CB1Checked
{
get { return _cb1Checked; }
set
{
_cb1Checked = value;
PropertyChanged(this, new PropertyChangedEventArgs("CB1Checked"));
PropertyChanged(this, new PropertyChangedEventArgs("CB3Checked"));
}
}
public bool CB2Checked
{
get { return _cb2Checked; }
set
{
_cb2Checked = value;
PropertyChanged(this, new PropertyChangedEventArgs("CB2Checked"));
PropertyChanged(this, new PropertyChangedEventArgs("CB3Checked"));
}
}
public bool CB3Checked
{
get { return _cb1Checked && _cb2Checked; }
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
设置CB1Checked
或CB2Checked
后,您需要引发CB3Checked
也发生变化的事件。
你的XAML看起来像(这是来自记忆......):
<CheckBox IsChecked={Binding CB1Checked}" />
<CheckBox IsChecked={Binding CB2Checked}" />
<CheckBox IsChecked={Binding CB3Checked, Mode=OneWay}" />
正如@wkl在评论中指出的那样,第三个复选框应该是单向绑定,因为无法设置该值。
有些MVVM框架可能会让你更容易,但我没有使用任何能够推荐的。
答案 1 :(得分:3)
你可以这样做一个复选框:
<CheckBox x:Name="cb3" IsChecked="{Binding Path=IsChecked, ElementName=cb2}" />
我假设另一个复选框名为 cb2
。
对于多个复选框,我建议您Binding
中使用DataContext
。
<CheckBox IsChecked="{Binding Path=CB_1_Checked}" Content="CheckBox 1" />
public bool CB_1_Checked
{
get { return _cb_1_checked; }
set
{
_cb_1_checked = value;
OnPropertyChanged();
//Notify that CB_3_Checked may have changed:
OnPropertyChanged("CB_3_Checked");
}
}
对CB1和CB2执行此操作。
为CB3添加此内容
//Will return 'true' when both are checked (but lacks OnPropertyChanged !)
public bool CB_3_Checked => (CB_1_Checked && CB_2_Checked);
或者有更多选择:
private bool _cb_3_checked;
public bool CB_3_Checked
{
get
{
if(CB_1_Checked && CB_2_Checked)
{
_cb_3_checked = true;
}
return _cb_3_checked;
}
set
{
_cb_3_checked = value;
OnPropertyChanged();
}
}
详细了解Bindings here.