2010-12-14 240 views
6

我有一個select'All'複選框,我想綁定到其他複選框的(IsChecked ||!IsEnabled)。WPF綁定複選框IsChecked到其他複選框(IsChecked ||!IsEnabled)

  • 檢查'全部'檢查所有啓用的複選框。

  • 取消選中「全部」將取消選中所有複選框。

  • 手動檢查每個啓用的複選框將檢查'全部'。

  • 當所有啓用的複選框和'全部'被選中並且用戶取消選中任何複選框時,'全部'自動取消選中。

我是WPF數據綁定的新手。我想也許我只是處理點擊'全部'來設置其他複選框。但我不知道如何綁定到多個來源的屬性。當我點擊「全部」並手動取消選中另一個複選框時,「全部」需要取消選中。

回答

12

這是一種在Xaml與轉換器做到這一點。這是假設你所有的CheckBox都直接作爲Xaml中的控件添加(它不是很動態,不適用於DataTemplate的等)。首先,我們創建三個CheckBoxes(CheckBox1,CheckBox2,CheckBox3),在檢查CheckAllCheckBox時將被選中/取消選中。它也會反向工作。

更新
最後一部分(忽略禁用複選框)是有點問題,在這裏,我不是瘋了這個解決方案,但我不能看到一個更好的辦法。我們存儲來自Convert的值,並在禁用CheckBox的ConvertBack中重新使用它們。這樣做,我們也應該添加X:共享=「假」爲CheckAllConverter屬性,因爲一個新的實例需要每個MultiBinding將使用它(不太可能在這種情況下,但仍..)

<Window.Resources> 
    <local:CheckAllConverter x:Key="CheckAllConverter" x:Shared="False"/> 
</Window.Resources> 
<StackPanel> 
    <CheckBox Content="Check All" 
       Name="CheckAllCheckBox"> 
     <CheckBox.IsChecked> 
      <MultiBinding Converter="{StaticResource CheckAllConverter}"> 
       <Binding ElementName="CheckBox1" Path="IsChecked" /> 
       <Binding ElementName="CheckBox1" Path="IsEnabled" Mode="OneWay"/> 
       <Binding ElementName="CheckBox2" Path="IsChecked" /> 
       <Binding ElementName="CheckBox2" Path="IsEnabled" Mode="OneWay"/> 
       <Binding ElementName="CheckBox3" Path="IsChecked" /> 
       <Binding ElementName="CheckBox3" Path="IsEnabled" Mode="OneWay"/> 
      </MultiBinding> 
     </CheckBox.IsChecked> 
    </CheckBox> 
    <CheckBox Content="CheckBox 1" 
       Name="CheckBox1"/> 
    <CheckBox Content="CheckBox 2" 
       Name="CheckBox2"/> 
    <CheckBox Content="CheckBox 3" 
       Name="CheckBox3"/> 
</StackPanel> 

的用於CheckAll的轉換器

public class CheckAllConverter : IMultiValueConverter 
{ 
    private object[] convertValues = null; 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     convertValues = new object[values.Length]; 
     for(int i = 0; i < values.Length; i++) 
     { 
      convertValues[i] = values[i]; 
     } 

     for (int i = 0; i < values.Length; i += 2) 
     { 
      bool isChecked = (bool)values[i]; 
      bool isEnabled = (bool)values[i + 1]; 
      if (isEnabled == false) 
      { 
       continue; 
      } 
      if (isChecked == false) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     object[] values = new object[targetTypes.Length]; 
     for (int i = 0; i < values.Length; i += 2) 
     { 
      if (convertValues != null && (bool)convertValues[i + 1] == false) 
      { 
       values[i] = convertValues[i]; 
      } 
      else 
      { 
       values[i] = value; 
      } 
      // IsEnabled is OneWay and won't care about this value 
      values[i + 1] = null; 
     } 
     return values; 
    } 
} 
+0

這太好了。我不需要取消選中複選框或其他轉換器,我刪除了要禁用的觸發器。但是,我想允許其他複選框被禁用。他們不應該在禁用時進行檢查,但他們不會對所有檢查進行計數。例如, 。如果複選框2被禁用,則單擊全選將不會檢查它。如果我選擇了Checkbox1/3,則選中全部檢查。 – TrevDev 2010-12-14 21:42:40

+0

是的,這就是我的想法:)一個複選框應該這樣做,因爲它可以同時工作,我錯過了這個問題。我會更新我的答案,並看看您的意見 – 2010-12-14 21:58:18

+0

謝謝!我開始玩你給的東西。我通過將單向綁定到IsEnabled屬性使其變得混亂。當轉換一個未選中的複選框時,我檢查i + 1的單向啓用屬性heh。它的混亂,我沒有看到一種方式來忽略禁用複選框轉換回來。我很想看到你提出的解決方案。 – TrevDev 2010-12-14 22:00:58

1

我使用MVVM設計模式背後創建你的視圖類視圖模型:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

然後在您的視圖模型(這將不得不執行INotifyPropertyChanged),你可以有多個bool特性,每一個CheckBox和另一爲他們所有人:

public bool IsChecked1 
{ 
    get 
    { 
     return isChecked1; 
    } 
    set 
    { 
     if (isChecked1 != value) 
     { 
      isChecked1 = value; 
      RaisePropertyChanged("IsChecked1"); 
      RaisePropertyChanged("AreAllChecked"); 
     } 
    } 
} 

// And so on 

public bool AreAllChecked 
{ 
    get 
    { 
     return IsChecked1 && IsChecked2; // etc. 
    } 
    set 
    { 
     if (AreAllChecked != value) 
     { 
      IsChecked1 = value; 
      IsChecked2 = value; 
      // etc. 
     } 
    } 
} 
+0

不是一個好的解決方案國際海事組織。如果有50個複選框會怎麼樣? – 2017-05-26 00:09:21

相關問題