2010-12-14 181 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

相关问题