我在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>
这也有助于我想要做的一件事是触发动画,而不仅仅是设置可见性。
任何帮助都会很棒。
答案 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也显示了这种方法,并包含因触发而被触发的动画。