C# 多准则上的WPF绑定

C# 多准则上的WPF绑定,c#,.net,wpf,mvvm,binding,C#,.net,Wpf,Mvvm,Binding,在我的MVVM中,在视图中,我有一个DataGrid,我希望在其中基于2个条件启用行元素。DataGrid在1列(绑定到IsRowChecked属性)中有一个复选框,在另一列中有一个标题复选框。如果 1) IsRowChecked为真且 2) 已选中标题复选框 这种多标准设置是否可行 XAML “化学品数量”col只需要一个标准约束,我可以做到这一点。Value1和Value2需要两个标准,即选中IsRowChecked和header复选框。我可以使用single,但无法在这些绑定中实现2个

在我的MVVM中,在视图中,我有一个DataGrid,我希望在其中基于2个条件启用行元素。DataGrid在1列(绑定到IsRowChecked属性)中有一个复选框,在另一列中有一个标题复选框。如果 1) IsRowChecked为真且 2) 已选中标题复选框

这种多标准设置是否可行

XAML


“化学品数量”col只需要一个标准约束,我可以做到这一点。Value1和Value2需要两个标准,即选中IsRowChecked和header复选框。我可以使用single,但无法在这些绑定中实现2个标准

如何实现这种绑定

非常感谢您的帮助


多亏了有两种方法可以处理绑定上的复杂表达式:
MultiBinding
使用转换器和
MultiDataTrigger
使用特定情况。就你的例子来说,两者都很好地工作

1。多重绑定

这种方法几乎适用于任何情况,但需要实现转换器(显然,它们可以重用)

  • 创建
    AndConverter
    类实现
    IMultiValueConverter
    接口。如果传递给它的所有值都为true,则它需要返回
    true
    DependencyProperty.UnsetValue
    在值不可用时是一个特殊值)

  • 将转换器添加到资源:

    <Window.Resources>
        <local:AndConverter x:Key="convAnd"/>
    </Window.Resources>
    
  • 2。多数据触发器

    当只有一个属性值配置需要特定行为时,此方法有效。在您的示例中,文本框始终处于禁用状态,除非选中了两个复选框。语法更复杂,但不需要转换器

  • Value2
    列指定
    DataTemplate
    (注释原始代码):

    
    

  • 哇,阿萨里,两个选项都很好用。我想知道该用哪一个。在这种情况下,我想我将只使用多重绑定。还有一个问题,我可以在我的标题复选框上实现相同的功能吗?如果选择了Value1 Header chkbox,则只允许用户选择Value2 Header复选框。最初,应禁用Value2标头chkbox,当用户选择Value1 chkValue1时,仅启用chkValue2。这可以在标题复选框中实现吗?@Tvd我不理解确切的布尔表达式,但在任何情况下,您都可以使用带转换器的
    多重绑定。
    MultiBinding
    可以包含任意数量的
    Binding
    s,值通过
    values
    参数传递给
    IMultiValueConverter.Convert
    方法。在这个方法中,您可以编写任何想要的逻辑表达式。我在
    Convert
    中使用的代码有点复杂,因为它是泛型的,可以检查所有的可能性,但基本上它是
    返回(bool)值[0]&(bool)值[1]
    public class AndConverter : IMultiValueConverter
    {
        public object Convert (object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Any(v => ReferenceEquals(v, DependencyProperty.UnsetValue)))
                return DependencyProperty.UnsetValue;
            return values.All(System.Convert.ToBoolean);
        }
    
        public object[] ConvertBack (object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
    
    <Window.Resources>
        <local:AndConverter x:Key="convAnd"/>
    </Window.Resources>
    
    <DataTemplate DataType="local:Item">
        <!--<TextBox IsEnabled="{Binding ElementName=chkValue11, Path=IsChecked}" Text="{Binding Path=Value1, Mode=TwoWay}"/>-->
        <TextBox Text="{Binding Path=Value1, Mode=TwoWay}">
            <TextBox.IsEnabled>
                <MultiBinding Converter="{StaticResource convAnd}">
                    <Binding ElementName="chkValue11" Path="IsChecked"/>
                    <Binding Path="IsRowChecked"/>
                </MultiBinding>
            </TextBox.IsEnabled>
        </TextBox>
    </DataTemplate>
    
    <DataTemplate DataType="local:Item">
        <!--<TextBox IsEnabled="{Binding ElementName=chkValue12, Path=IsChecked}" Text="{Binding Path=Value2, Mode=TwoWay}"/>-->
        <TextBox x:Name="txt" Text="{Binding Path=Value2, Mode=TwoWay}"
                 IsEnabled="False"/>
        <DataTemplate.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding IsChecked, ElementName=chkValue12}" Value="True"/>
                    <Condition Binding="{Binding IsRowChecked}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <Setter TargetName="txt" Property="IsEnabled" Value="True"/>
            </MultiDataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>