C# 多准则上的WPF绑定
在我的MVVM中,在视图中,我有一个DataGrid,我希望在其中基于2个条件启用行元素。DataGrid在1列(绑定到IsRowChecked属性)中有一个复选框,在另一列中有一个标题复选框。如果 1) IsRowChecked为真且 2) 已选中标题复选框 这种多标准设置是否可行 XAMLC# 多准则上的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个
“化学品数量”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>
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>