0

オブジェクトの対応するブール値プロパティにデータバインドされたいくつかのチェックボックスを含む WPF ウィンドウがあります。INotifyPropertyChanged からオブジェクトを派生させたので、データの変更はビューに反映され、ビューの変更はデータに反映されます。

ここで、「すべて選択/すべて選択解除」として機能し、次のように機能する 3 つの状態を持つ別のチェックボックスを追加する必要があります。

  • ユーザーがチェックした場合 - 他のすべてのチェックボックスをチェックします
  • ユーザーがチェックを外した場合 - 他のすべてのチェックボックスをオフにします
  • 他のすべてのチェックボックスがオンの場合 – チェック済みとして表示されます
  • 他のすべてのチェックボックスがチェックされていない場合 – チェックされていないものとして表示されます
  • 他のチェックボックスのいくつかがチェックされている場合 – 不確定として表示されます

私はWPFが初めてです。WPFでどうすればできますか?

4

1 に答える 1

1

この問題に取り組むためのはるかに良い方法があると確信していますが、これが私が思いついた簡単な解決策です。

XAMLは次のとおりです。

<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です。

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;
        }
    }
于 2013-03-22T14:22:05.523 に答える