WPF:复选框选中所有其他复选框,取消选中“视觉差异”
我已经为我的应用程序定制了一些复选框设计,下面是它们的图片。应该很清楚,但是第一个顶部有style1(所有都被选中) 第二个只是一个复选框,比如说style2 但是第三个是style3,因为这将显示它的一些子复选框被选中,但不是全部,单击它将取消选中/全部选中 我有两个问题WPF:复选框选中所有其他复选框,取消选中“视觉差异”,wpf,Wpf,我已经为我的应用程序定制了一些复选框设计,下面是它们的图片。应该很清楚,但是第一个顶部有style1(所有都被选中) 第二个只是一个复选框,比如说style2 但是第三个是style3,因为这将显示它的一些子复选框被选中,但不是全部,单击它将取消选中/全部选中 我有两个问题 有没有办法只使用XAML将这些复选框绑定在一起,这样就有一个主复选框可以取消选中并选中它的子项,或者我必须使用C#命令 这是主要问题,当选中所有复选框和仅选中部分复选框时,为主复选框指定不同样式的最佳方式是什么 首先-是的,
首先-是的,您可以使用
多绑定
。
第二种-如果复选框有三种样式(第一种为allChecked,第二种为allunchecked,第三种为部分选中和部分未选中),则可以编写一种样式,将其他样式与触发器结合起来,分配给IsChecked
属性。
我给你写了一些例子
<StackPanel>
<CheckBox Name="cb1" IsChecked="{Binding Is1}" />
<CheckBox Name="cb2" IsChecked="{Binding Is2}" />
<CheckBox Name="cb3" IsChecked="{Binding Is3}" />
<CheckBox Name="cbMaster" Content="Master">
<CheckBox.Resources>
<local:CheckBoxConverter x:Key="cbConv" />
</CheckBox.Resources>
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource cbConv}">
<Binding Path="Is1" />
<Binding Path="Is2" />
<Binding Path="Is3" />
</MultiBinding>
</CheckBox.IsChecked>
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<Trigger Property="IsChecked" Value="{x:Null}">
<Setter Property="Foreground" Value="Red" />
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Foreground" Value="Green" />
</Trigger>
<Trigger Property="IsChecked" Value="false">
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</StackPanel>
public class CheckBoxConverter : IMultiValueConverter
{
public object Convert( object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
bool isChecked = values.Contains( true );
bool isUnchecked = values.Contains( false );
if ( isChecked && isUnchecked )
{
// some checked and uncheked
return null;
}
else if ( isChecked )
{
return true;
}
return false;
}
public object[] ConvertBack( object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture )
{
int count = targetTypes.Length;
object[] result = new object[count];
if ( ( bool )value == true )
{
for ( int i = 0; i < count; i++ )
{
result[i] = true;
}
}
else
{
for ( int i = 0; i < count; i++ )
{
result[i] = false;
}
}
return result;
}
}
public class CheckBoxViewModel : INotifyPropertyChanged
{
private bool _is1;
public bool Is1
{
get { return _is1; }
set { _is1 = value; NotifyPropertyChanged( "Is1" ); }
}
...
}