我有一个选择“所有”复选框,我想将其绑定到其他复选框的(签名||!ISENABLED)。

  • 检查“所有”检查所有已启用的复选框。

  • 取消选中的“所有”取消选中所有复选框。

  • 手动检查每个启用的复选框将检查“全部”。

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

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

有帮助吗?

解决方案

这是一种在XAML中使用转换器进行操作的方法。这是假设您的所有复选框都直接添加为XAML中的控件(它不是很动态,对DataTemplate的等等不起作用)。首先,我们创建三个复选框(Checkbox1,Checkbox2,Checkbox3),在检查CheckAllCheckbox时将检查/未选中。它也将反向起作用。

更新
最后一部分(忽略禁用的复选框)在这里有点问题,我对此解决方案并不疯狂,但我看不到更好的方法。我们将转换的值存储在禁用复选框中的转换式中。这样做,我们还应该为CheckAllConverter添加X:共享=“ false”属性,因为每个使用它的多键都需要一个新实例(在这种情况下不太可能,但仍然如此。)

<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;
    }
}

其他提示

我将使用MVVM设计模式在您的视图类背后创建一个ViewModel: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

然后在您的ViewModel上(必须实现InotifyPropertychanged),您可以拥有多个 bool 属性,每个复选框,另一个用于所有复选框:

public bool IsChecked1
{
    get
    {
         return isChecked1;
    }
    set
    {
         if (isChecked1 != value)
         {
             isChecked1 = value;
             RaisePropertyChanged("IsChecked1");
             RaisePropertyChanged("AreAllChecked");
         }
    }
}

// And so on

public bool AreAllChecked
{
    get
    {
        return IsChecked1 && IsChecked2; // etc.
    }   
    set
    {
        if (AreAllChecked != value)
        {
            IsChecked1 = value;
            IsChecked2 = value;
            // etc.
        }
    }
}  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top