sti*_*k81 25 .net data-binding wpf triggers
我正在研究WPF应用程序并且正在努力处理数据触发器.我想将触发条件的值绑定到我拥有的某个对象:
<DataTrigger Binding="{Binding Foo}" 
             Value="{Binding ElementName=AnotherElement, Path=Bar}">..
但是,我不被允许,因为似乎不可能为Value属性使用绑定.是吗?我能以某种方式实现吗?我收到以下错误:
无法在"DataTrigger"类型的"Value"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.
ito*_*son 37
不,这是不可能的.正如错误消息所述,只有依赖项属性可以是WPF绑定的目标,而DataTrigger.Value不是依赖项属性.所以你需要分配一个实际值.
解决方法是使用MultiBinding,其子Bindings是您要比较的两个绑定,IMultiValueConverter如果两个输入相等则返回true,如果它们不相等则返回false.然后,DataTrigger可以使用该MultiBinding,并使用Value of True.
这是IMultiValueConverter转换器的示例。
<!-- 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>
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();
    }
}
| 归档时间: | 
 | 
| 查看次数: | 19940 次 | 
| 最近记录: |