2010-05-31 28 views
1

我在XAML中有一个Adorner,用于ErrorValidation。基本上我有一个网格,我想在两种情况下显示(如果“AdornedElement”IsFocused或IsMouseOver)。触发器中的AdornedElement属性

下面是我成功绑定到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> 

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

任何帮助将是伟大的。 (虽然不是在Silverlight)

回答

2

你正在寻找所谓的MultiBinding和内置WPF

<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来完成,因为它们对于附加简单的动画更简单一些。

1

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

This answer也显示了这种方法,并且包括由于触发而被触发的动画。

相关问题