2012-04-27 58 views
4

我將信息顯示爲啓用ThreeState的複選框,並希望以最簡單的方式使用可爲null的布爾值。如何將一個可空的布爾綁定到複選框?

當前我正在使用嵌套的三元表達式;但有沒有更清晰的方法?

bool? foo = null; 
checkBox1.CheckState = foo.HasValue ? 
    (foo == true ? CheckState.Checked : CheckState.Unchecked) : 
    CheckState.Indeterminate; 

*請注意,複選框和窗體是隻讀的。

回答

4

這就是我會這麼做的。

我會添加一個擴展方法來清理它。

public static CheckState ToCheckboxState(this bool booleanValue) 
    { 
     return booleanValue.ToCheckboxState(); 
    } 

    public static CheckState ToCheckboxState(this bool? booleanValue) 
    { 
     return booleanValue.HasValue ? 
       (booleanValue == true ? CheckState.Checked : CheckState.Unchecked) : 
       CheckState.Indeterminate; 
    } 
+0

它在所有地方重複,所以我想簡化的原因。 – JYelton 2012-04-27 20:18:38

+0

只需爲您寫入擴展方法代碼,1秒 – 2012-04-27 20:19:36

+0

我熟悉擴展方法,但我不確定如何處理「ThreeState」未啓用的情況。 – JYelton 2012-04-27 20:20:23

2

更清楚的是一個有爭議的說法。例如,我可以說這更清楚。

if(foo.HasValue) 
{ 
    if(foo == true) 
     checkBox1.CheckState = CheckState.Checked; 
    else 
     checkBox1.CheckState = CheckState.Unchecked; 
} 
else 
    checkBox1.CheckState = CheckState.Indeterminate; 

另一種選擇是隻創建一個方法是:

checkBox1.CheckState = GetCheckState(foo); 

public CheckState GetCheckState(bool? foo) 
{ 
    if(foo.HasValue) 
    { 
     if(foo == true) 
      return CheckState.Checked; 
     else 
      return CheckState.Unchecked; 
    } 
    else 
     return CheckState.Indeterminate 

} 

不過,我喜歡你的代碼。

+0

我喜歡'GetCheckState()'方法的想法。 – JYelton 2012-04-27 20:31:44

+0

您也可以擴展該方法並通過複選框。所以你可以測試是否啓用了ThreeState。 – Steve 2012-04-27 20:42:56

0

基於擴展方法@彌敦道的建議下,我想出了這個:

public static void SetCheckedNull(this CheckBox c, bool? Value) 
{ 
    if (!c.ThreeState) 
     c.Checked = Value == true; 
    else 
     c.CheckState = Value.HasValue ? 
      (Value == true ? CheckState.Checked : CheckState.Unchecked) : 
      CheckState.Indeterminate; 
} 

我不喜歡它的唯一的事情,就是設置在一個「正常」的複選框:

checkBox1.Checked = someBool; 

對戰設置啓用三態-複選框:

checkBox2.SetCheckedNull(someNullableBool); 

後者只是感覺不同足夠塔它調整了一點OCD。 :)

相關問題