WPF:复选框选中所有其他复选框,取消选中“视觉差异”

WPF:复选框选中所有其他复选框,取消选中“视觉差异”,wpf,Wpf,我已经为我的应用程序定制了一些复选框设计,下面是它们的图片。应该很清楚,但是第一个顶部有style1(所有都被选中) 第二个只是一个复选框,比如说style2 但是第三个是style3,因为这将显示它的一些子复选框被选中,但不是全部,单击它将取消选中/全部选中 我有两个问题 有没有办法只使用XAML将这些复选框绑定在一起,这样就有一个主复选框可以取消选中并选中它的子项,或者我必须使用C#命令 这是主要问题,当选中所有复选框和仅选中部分复选框时,为主复选框指定不同样式的最佳方式是什么 首先-是的,

我已经为我的应用程序定制了一些复选框设计,下面是它们的图片。应该很清楚,但是第一个顶部有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" ); }
        }
        ...
    }