首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复选框中有3种状态,它们将在WPF中充当“Select/ Unselect”

复选框中有3种状态,它们将在WPF中充当“Select/ Unselect”
EN

Stack Overflow用户
提问于 2013-03-22 13:45:18
回答 1查看 1.4K关注 0票数 0

我有一个WPF窗口,其中有几个复选框,这些复选框被绑定到对象中相应的布尔属性。我从INotifyPropertyChanged派生出我的对象,所以数据中的变化反映在视图中,视图中的更改反映在数据中。

现在,我必须添加另一个带有3个状态的复选框,这些状态将充当“Select/ Unselect”,并按如下方式工作:

  • 如果被用户选中-将选中所有其他复选框。
  • 如果未被用户选中-将取消选中所有其他复选框。
  • 如果选中了所有其他复选框,则将显示为选中。
  • 如果所有其他复选框都未选中,则将显示为未选中。
  • 如果选中了其他一些复选框,则将显示为不确定项。

我是WPF的新手。我怎样才能在WPF中做到呢?

EN

回答 1

Stack Overflow用户

发布于 2013-03-22 14:22:05

我相信有一个更好的方法来解决这个问题,但是我想出了一个快速的解决方案,看起来很有效。

以下是XAML:

代码语言:javascript
复制
<Window x:Class="StackOverflow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:StackOverflow"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:AllNoneCheckboxConverter x:Key="converter"/>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <CheckBox x:Name="chk1" Content="1"/>
            <CheckBox x:Name="chk2" Content="2"/>
            <CheckBox x:Name="chk3" Content="3"/>
            <CheckBox x:Name="all" Content="all">
                <CheckBox.IsChecked>
                    <MultiBinding Converter="{StaticResource converter}">
                        <Binding ElementName="chk1" Path="IsChecked"/>
                        <Binding ElementName="chk2" Path="IsChecked"/>
                        <Binding ElementName="chk3" Path="IsChecked"/>
                    </MultiBinding>
                </CheckBox.IsChecked>
            </CheckBox>
        </StackPanel>
    </Grid>
</Window>

这里是MultiValueConverter;

代码语言:javascript
复制
class AllNoneCheckboxConverter: IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool result = (bool)values[0];
            for (int i = 0; i < values.Length; i++)
                if (result != (bool)values[i])
                    return null;

            return result;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            object[] result = new object[targetTypes.Length];
            bool isChecked = (bool)value;

            for (int i = 0; i < result.Length; i++)
                if (isChecked)
                    result[i] = true;
                else
                    result[i] = false;

            return result;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15571903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档