2017-02-23 6 views
1

3つのチェックボックスがあります。 cb1cb2cb3と呼ぶことができます。 cb3は、cb1cb2がチェックされているかどうかを確認する必要があります。これをWPFでどのように実装するのですか?私はWPFが初めてです。 ありがとうございます。チェックボックスバインディングWPF

+2

コード例を提供することで、私たちの助けになります。 –

+2

'IsChecked'値の取り扱い方法を表示します。 ViewModelのMVVMで簡単に解決できます。 – Sinatr

+0

あなたはビューモデルを使用していますか? –

答えて

4

、ちょうど新しい計算されたプロパティを追加それに。

単純なビューモデルは次のようになります。CB1CheckedまたはCB2Checkedを設定した後

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

、あなたはCB3Checkedも変更されたことをイベントを発生させる必要があります。

あなたのXAMLは、(これはメモリからです...)のようになります。

<CheckBox IsChecked={Binding CB1Checked}" /> 
<CheckBox IsChecked={Binding CB2Checked}" /> 
<CheckBox IsChecked={Binding CB3Checked, Mode=OneWay}" /> 

@wklはコメントで指摘するように、第三のチェックボックスの値があるため結合片道でなければなりません設定できません。

いくつかのMVVMフレームワークではこれを少し楽にするかもしれませんが、私は何かを推薦することはできませんでした。

+1

readonlyプロパティにバインドするときにcb3にOneWay-Bindingを使用する必要があることを追加したかっただけです。また、cb3を無効にして、ユーザーが手動で変更して一貫性を失わないようにすることもできます。 – wkl

+0

@wkl優秀な点、私は後で私が手を差し伸べる道具を持っている時にそれを編集しようとします –

3

あなたは、単一のチェックボックスのために、このようにそれを行うことができます。私は、他のチェックボックスが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); 

それとも少しより多くのオプションを持つためにこれを追加:あなたはViewModelにを使用している場合

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.