2

我在 XAML 中有一个 Adorner,用于 ErrorValidation。基本上我有一个网格,我想在两个条件下显示(如果“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>

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

任何帮助都会很棒。

4

2 回答 2

3

您正在寻找的东西称为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 元素的可见性更改的动画,请直接在可见性属性上设置触发器 - 当 MultiBinding 导致 DependencyProperty 的值发生更改时,它应该被调用。此外,可能值得考虑使用Behaviors来实现这一点,因为它们对于附加简单动画来说更直接一些。

于 2010-06-04T09:50:29.883 回答
2

我有类似的情况,我想使用触发器。像你一样,我无法让它与普通的<Trigger>. 但我终于发现你可以使用 a<DataTrigger>来触发装饰元素的属性。Marco Zhou 对这个问题的回答显示了要使用的语法。

这个答案也显示了这种方法,并包括由于触发器而触发的动画。

于 2012-12-18T19:04:51.930 回答