这是一种在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;
}
}
这太好了。我不需要取消选中复选框或其他转换器,我删除了要禁用的触发器。但是,我想允许其他复选框被禁用。他们不应该在禁用时进行检查,但他们不会对所有检查进行计数。例如, 。如果复选框2被禁用,则单击全选将不会检查它。如果我选择了Checkbox1/3,则选中全部检查。 – TrevDev 2010-12-14 21:42:40
是的,这就是我的想法:)一个复选框应该这样做,因为它可以同时工作,我错过了这个问题。我会更新我的答案,并看看您的意见 – 2010-12-14 21:58:18
谢谢!我开始玩你给的东西。我通过将单向绑定到IsEnabled属性使其变得混乱。当转换一个未选中的复选框时,我检查i + 1的单向启用属性heh。它的混乱,我没有看到一种方式来忽略禁用复选框转换回来。我很想看到你提出的解决方案。 – TrevDev 2010-12-14 22:00:58