触发器中的AdornedElement属性

时间:2010-05-31 21:32:28

标签: wpf binding triggers adorner

我在XAML中有一个我用于ErrorValidation的Adorner。基本上我有一个网格,我想在两个条件下显示(如果“AdornedElement”IsFocused或IsMouseOver)。

下面是一段代码片段,我将其成功绑定到AdornedElement的IsFocused,但正如您所知,只能解决1/2的条件。现在我不能将另一个绑定传递给转换器,也不能创建一个处理两者的属性(需要只是XAML解决方案)。

 <AdornedElementPlaceholder
                            x:Name="errorAdorner" />
                    ...

  <Grid
     x:Name="ErrorDetails"
     Visibility="{Binding ElementName=errorAdorner, Path=AdornedElement.IsFocused, Converter={StaticResource BooleanToVisibilityConverter}}" />

                   ...

我想要做的是使用触发器来处理这个问题,唯一的问题是我无法在触发器上访问AdornedElement的属性。

像这样......

        <Trigger
            SourceName="errorAdorner"
            Property="AdornedElement.IsFocused"
            Value="True">
            <Setter
                TargetName="ErrorDetails"
                Property="Visibility"
                Value="Visible" />
        </Trigger>

这也有助于我想要做的一件事是触发动画,而不仅仅是设置可见性。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

您正在寻找的内容称为MultiBinding,内置于WPF中(虽然不在Silverlight中。)

<Grid>
    <Grid.Resources>
        <c:BooleanPairToVisibilityConverter x:Key="booleanPairToVisibility" />
    </Grid.Resources>
    <Grid.Visibility>
        <MultiBinding Converter="{StaticResource booleanPairToVisibility}">
            <Binding ElementName="errorAdorner" Path="AdornedElement.IsFocused" />
            <Binding ElementName="errorAdorner" Path="AdornedElement.IsMouseOver" />
        </MultiBinding>
    </Grid.Visibility>
</Grid>

然后您需要一个简单的IMultiValueConverter将这些值转换为可见性:

public class BooleanPairToVisibilityConverter : IMultiValueConverter {
    public object Convert( object[] values, Type targetType, object parameter, CultureInfo culture )
    {
        if ( 2 != values.Length ) throw new ArgumentException( "values" );
        return ( (bool)values[0] || (bool)values[1] ) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object[] ConvertBack( object value, Type[] targetTypes, object parameter, CultureInfo culture )
    { throw new NotSupportedException(); }
}

不可否认,这并没有解决关于如何使用触发器执行此操作的第二个问题。我不会......

如果想要围绕ErrorDetails元素的可见性更改动画,请直接在visibility属性上设置触发器 - 当MultiBinding导致DependencyProperty的值发生更改时,应调用它。此外,可能值得考虑Behaviors来实现这一点,因为它们可以更简单地附加简单的动画。

答案 1 :(得分:1)

我有类似的情况,我想使用触发器。和你一样,我无法使用常规的<Trigger>。但我终于发现你可以使用<DataTrigger>来触发装饰元素的属性。 Marco Zhou对this question的回答显示了要使用的语法。

This answer也显示了这种方法,并包含因触发而被触发的动画。