2010-05-31 72 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也顯示了這種方法,並且包括由於觸發而被觸發的動畫。