這是一種在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