复选框绑定WPF

时间:2017-02-23 13:08:57

标签: c# wpf

我有3个复选框。让我们称呼他们cb1cb2cb3。选中cb3cb1时,应检查cb2。我如何在WPF中实现它。我是WPF的新手。 提前谢谢。

2 个答案:

答案 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));
    }
}

设置CB1CheckedCB2Checked后,您需要引发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.