使用绑定DataTrigger条件的Value属性

sti*_*k81 25 .net data-binding wpf triggers

我正在研究WPF应用程序并且正在努力处理数据触发器.我想将触发条件的值绑定到我拥有的某个对象:

<DataTrigger Binding="{Binding Foo}" 
             Value="{Binding ElementName=AnotherElement, Path=Bar}">..
Run Code Online (Sandbox Code Playgroud)

但是,我不被允许,因为似乎不可能为Value属性使用绑定.是吗?我能以某种方式实现吗?我收到以下错误:

无法在"DataTrigger"类型的"Value"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.

ito*_*son 37

不,这是不可能的.正如错误消息所述,只有依赖项属性可以是WPF绑定的目标,而DataTrigger.Value不是依赖项属性.所以你需要分配一个实际值.

解决方法是使用MultiBinding,其子Bindings是您要比较的两个绑定,IMultiValueConverter如果两个输入相等则返回true,如果它们不相等则返回false.然后,DataTrigger可以使用该MultiBinding,并使用Value of True.


chv*_*lav 6

这是IMultiValueConverter转换器的示例。

在此XAML中,有三个复选框。前两个绑定到Foo和Bar属性(均为布尔值)。第三个使用IMultiValueConverter的多重绑定。当Foo和Bar具有相同的值时,将进行检查。

<!-- It's expected that the DataContext of this StackPanel has boolean Bar and Foo properties.. -->
<StackPanel Orientation="Vertical">
    <StackPanel.Resources>
        <!-- local contains the MultiValueEqualityConverter class implementation -->
        <local:MultiValueEqualityConverter x:Key="multiValueEqualityConverter"/>
    </StackPanel.Resources>

    <CheckBox IsChecked="{Binding Foo}">Foo</CheckBox>
    <CheckBox IsChecked="{Binding Bar}">Bar</CheckBox>

    <CheckBox IsEnabled="False" Content="Are the same">
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Style.Setters>
                    <Setter Property="IsChecked" Value="False"/>
                </Style.Setters>
                <Style.Triggers>
                    <DataTrigger Value="True">
                        <DataTrigger.Binding>
                            <MultiBinding Converter="{StaticResource multiValueEqualityConverter}">
                                <Binding RelativeSource="{RelativeSource self}" Path="DataContext.Foo" Mode="OneWay" />
                                <Binding RelativeSource="{RelativeSource self}" Path="DataContext.Bar" Mode="OneWay"/>
                            </MultiBinding>
                        </DataTrigger.Binding>
                        <Setter Property="IsChecked" Value="True" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

IMultiValueConverter单向绑定的简单实现:

public class MultiValueEqualityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values?.All(o => o?.Equals(values[0]) == true) == true || values?.All(o => o == null) == true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)