gpt4 book ai didi

WPF 将复选框 IsChecked 绑定(bind)到其他复选框 (IsChecked || !IsEnabled)

转载 作者:行者123 更新时间:2023-12-04 13:35:05 25 4
gpt4 key购买 nike

我有一个选择“全部”复选框,我希望将其绑定(bind)到其他复选框的 (IsChecked || !IsEnabled)。

  • 选中“全部”会选中所有启用的复选框。
  • 取消选中“全部”会取消选中所有复选框。
  • 手动检查每个启用的复选框将选中“全部”。
  • 当所有启用的复选框和“全部”都被选中并且用户取消选中任何复选框时,“全部”会自动取消选中。

  • 我是 WPF 数据绑定(bind)的新手。我在想也许我只是点击“全部”来设置其他复选框。但我不知道如何绑定(bind)到多个来源的两个属性。当我单击“全部”并手动取消选中另一个复选框时,需要取消选中“全部”。

    最佳答案

    这是使用转换器在 Xaml 中执行此操作的一种方法。这是假设您的所有 CheckBox 都直接添加为 Xaml 中的控件(它不是很动态,不适用于 DataTemplate 等)。首先,我们创建三个 CheckBox(CheckBox1、CheckBox2、CheckBox3),在检查 CheckAllCheckBox 时它们将被选中/取消选中。它也将反向工作。

    更新
    最后一部分(忽略禁用的复选框)在这里有点问题,我对这个解决方案并不疯狂,但我看不到更好的方法。我们存储来自 Convert 的值并在 ConvertBack 中为禁用的 CheckBox 重新使用它们。这样做,我们还应该为 CheckAllConverter 添加 x:Shared="False"属性,因为每个使用它的 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;
    }
    }

    关于WPF 将复选框 IsChecked 绑定(bind)到其他复选框 (IsChecked || !IsEnabled),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4443363/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com