代码之家  ›  专栏  ›  技术社区  ›  Chris Nicol

触发器中的装饰元素属性

  •  1
  • Chris Nicol  · 技术社区  · 16 年前

    我在XAML中有一个装饰器,用于错误验证。基本上我有一个网格,我想在两种情况下显示它(如果“装饰元素”是聚焦的或是鼠标悬停的)。

    下面是一个代码片段,我成功地绑定到了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 回复  |  直到 16 年前
        1
  •  3
  •   hemp    16 年前

    你要找的东西叫做 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(); }
    }
    

    诚然,这并不能解决第二个问题,即如何使用触发器实现这一点。我不会。。。

    Behaviors 为了实现这一点,相反,他们是一个更直接的附加简单的动画。

        2
  •  2
  •   Community Mohan Dere    9 年前

    <Trigger> . 但我终于发现你可以用 <DataTrigger> 在装饰元素的属性上触发。马可·周的回答 this question

    This answer 还显示了此方法,并包括作为触发器结果而触发的动画。

    推荐文章