wpf - запускать datatrigger, когда свойство изменяется независимо от нового значения - PullRequest
24 голосов
/ 01 июня 2011

Я пытаюсь выполнить анимацию для ячейки в сетке данных, когда значение ячейки сетки данных изменяется.

Сама сетка данных связана с ObservableCollection простых старых объектов CLR.В этом случае предположим, что объекты являются объектами «Персона» со свойствами «Имя», «Фамилия» и «Возраст».Класс Person реализует интерфейс INotifyPropertyChanged, и каждое свойство имеет соответствующий вызов onPropertyChanged в своем установщике.

Это нормально.В определении сетки данных я установил свой DataTemplate для рисования каждой ячейки и также прикрепил источник данных ... следующим образом:

<DataGridTemplateColumn Header="FirstName">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Border Name="templateBorder">
                <TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName}" />
            </Border>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=FirstName}" Value="Richard">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard AutoReverse="True">
                                <DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Когда объект в моей коллекции ObservableCollection обновляется (я изменил значение FirstName),датагрид обновляется нормально.В соответствии с приведенным выше примером, если я изменил значение FirstName на «Richard», анимация также будет выполнена нормально.

Моя проблема заключается в том, что мне нужно запустить анимацию независимо от того, какое значение имеет Firstname.,Я просканировал сеть, но некоторые пока только находят примеры срабатывания триггера по известному значению, например, срабатывание триггера, когда FirstName имеет значение «Richard», как я продемонстрировал в моем примере.

Мой вопрос заключается в том, какзапустить datatrigger независимо от значения обновленного свойства?Итак, в основном, как мне запускать источник данных всякий раз, когда свойство FirstName обновляется для данной строки в сетке данных.

Большое спасибо.

Ответы [ 5 ]

42 голосов
/ 03 июня 2011

Благодаря указателям, полученным в ответах на этот вопрос, я нашел, что ответом было использование EventTrigger и TargetUpdated RoutedEvent.

<DataTemplate>
    <Border Name="templateBorder">
        <TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName, NotifyOnTargetUpdated=True}" />
    </Border>
    <DataTemplate.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <BeginStoryboard>
                <Storyboard AutoReverse="True">
                    <DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

Помимо EventTrigger, единственное, что требовалось, это установить NotifyOnTargetUpdated = True при настройке привязки для текстового блока.

Спасибо.

1 голос
/ 19 мая 2015
  <Storyboard x:Key="MessageStoryBoardEntry" FillBehavior="Stop">

            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                <EasingDoubleKeyFrame KeyTime="0:0:00.30" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:03" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:03.20" Value="1500"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>

        <Storyboard x:Key="MessageStoryBoardExit" FillBehavior="Stop">

            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                <EasingDoubleKeyFrame KeyTime="0:0:0.001" Value="1500"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
1 голос
/ 01 июня 2011

Похоже, вам нужен EventTrigger"do X при возникновении события" вместо DataTrigger.

Сам не пробовал .. но должна быть возможность вызвать ваше пользовательское событие FirstNameChanged и выполнить триггерные действия в ответ на это.

0 голосов
/ 01 июня 2011

Не могли бы вы взломать что-нибудь с помощью преобразователя значений?

<DataTrigger Binding="{Binding Path=FirstName, Converter=FirstNameConverter}" Value="MakeItSo">

и

class FirstNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return "MakeItSo";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
...
    }
}

Полагаю, это зависит от того, вызывает ли WPF конвертер при каждом изменении свойства или сначала оценивает значение.Я не пробовал, это просто мысль ...

0 голосов
/ 01 июня 2011

Вы можете попробовать установить для DataContext TextBlock свойство FirstName, а затем использовать событие DataContextChanged .

Или вы можете использовать событие PropertyChanged и фильтр для требуемого свойства.

В любом случае, я думаю, вам придется использовать событие.

...