Свойства AdornedElement в триггере - PullRequest
1 голос
/ 01 июня 2010

У меня есть Adorner в XAML, который я использую для ErrorValidation. В основном у меня есть сетка, которую я хочу отобразить при двух условиях (если «AdornedElement» IsFocused или IsMouseOver).

Ниже приведен фрагмент кода, в котором я успешно привязываю IsFocused элемента AdornedElement, но, как вы можете сказать, он решает только половину условий. Теперь я не могу передать еще одну привязку в конвертер и не могу создать свойство, которое обрабатывает оба (должно быть решением только для 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 ]

2 голосов
/ 04 июня 2010

То, что вы ищете, называется 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. Кроме того, возможно, стоит подумать о Поведениях , чтобы достичь этого, поскольку они немного более просты для добавления простых анимаций.

1 голос
/ 18 декабря 2012

У меня была похожая ситуация, когда я хотел использовать триггер. Как и вы, я не мог заставить его работать с обычным <Trigger>. Но в конце концов я обнаружил, что вы можете использовать <DataTrigger> для запуска свойства украшенного элемента. Ответ Марко Чжоу на на этот вопрос показывает используемый синтаксис.

Этот ответ также показывает этот подход и включает анимацию, запускаемую в результате триггера.

...