Подтвердить что ты не робот

Wpf - fire datatrigger при изменении свойств независимо от нового значения

Я пытаюсь выполнить анимацию в ячейке в datagrid при изменении значения ячейки datagrid.

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

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

<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), datagrid обновляется отлично. В соответствии с приведенным выше примером, если я изменил значение FirstName на "Richard", анимация также будет выполнена отлично.

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

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

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

4b9b3361

Ответ 1

Благодаря указателям, полученным в ответах на этот вопрос, я нашел ответ, чтобы использовать 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" при настройке привязки для текстового блока.

Спасибо.

Ответ 2

Похоже, вам нужно EventTrigger "делать X, когда происходит событие" вместо DataTrigger.

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

Ответ 3

  <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>

Ответ 4

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

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

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

Ответ 5

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

<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 конвертер при каждом изменении свойства или оценивает ли он значение сначала. Я не пробовал, это просто мысль...