2017-02-23 107 views
1

我有3個複選框。讓我們稱他們爲cb1cb2cb3。當檢查cb1cb2時,應該檢查cb3。我如何在WPF中實現這一點?我是WPF的新手。 在此先感謝。複選框綁定WPF

+2

提供代碼示例可以幫助我們爲您提供幫助。 –

+2

顯示您現在如何處理(使用)'IsChecked'值。使用ViewModel中的MVVM很容易解決。 – Sinatr

+0

您使用的是viewmodel嗎? –

回答

4

如果您使用的是視圖模型,只需添加一個新的計算性能對此。

一個簡單的視圖模型會是什麼樣子:

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

只是想補充一點,當你綁定到一個只讀屬性時,你必須使用一個單向綁定的cb3。你可能想禁用cb3,以防止用戶手動改變它,從而破壞一致性。 – wkl

+0

@wkl優秀的一點,我會嘗試編輯,稍後當我有手工具 –

3

你可以做這樣的一個複選框:

我想其他的複選框被稱爲cb2

對於多個複選框,我建議您在BindingDataContext

<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.