Срабатывает на DataTemplate при обновлении данных

#wpf #binding

#wpf #привязка

Вопрос:

У меня есть шаблон данных для элемента списка, похожий на тот, что на этой странице… Ссылка

Я хотел бы сделать еще один шаг вперед и сделать что-нибудь, чтобы выделить элементы при их изменении. Например, используя код по ссылке выше, я хотел бы установить триггер для выполнения чего-либо, когда виджет.Изменяется количество. Может быть, заставить элемент quiantity (больше ничего) мигать или что-то в этом роде. Как я могу это сделать? Я включаю соответствующий код ниже…

     <Window.Resources>
    <Style x:Key="RoundedItem" TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border CornerRadius="10" BorderBrush="Black" BorderThickness="1" Margin="1">
                        <ContentPresenter />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <DataTemplate DataType="{x:Type local:Widget}">
        <StackPanel Orientation="Horizontal">
            <Label Content="{Binding Name}" />
            <Label Content="{Binding Quantity}" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding Widgets}" ItemContainerStyle="{StaticResource RoundedItem}" HorizontalContentAlignment="Stretch" />
  

Ответ №1:

Просто добавьте триггеры в табличку данных.Запускает сбор.

 <DataTemplate DataType="{x:Type local:Widget}">
    <StackPanel x:Name="panel" Orientation="Horizontal">
        <Label Content="{Binding Name}" />
        <Label Content="{Binding Quantity}" />
    </StackPanel>

    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding SomeProperty}" Value="True">
            <Setter Property="Background" Value="Yellow" TargetName="panel" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
  

Комментарии:

1. Да, я использовал нечто подобное раньше, чтобы изменить фон listboxitem при выборе всего элемента. Я хочу определить, когда что-то внутри элемента изменяется, а затем применить какой-то эффект к этому подпункту. В приведенном примере кода я хотел бы знать, когда изменится значение <Содержимое метки=»{Количество привязки}» />, а затем заставить этот элемент управления меткой мигать (или сделать что-то видимое в любом случае).

Ответ №2:

Вероятно, вы захотите добавить свойство в свой класс Widget для этого. Или, если Widget является моделью, вы можете захотеть обернуть его в класс WidgetViewModel со свойством «IsFlashing» для него. Затем установите триггер срабатывающим всякий раз, когда это свойство «IsFlashing» имеет значение True.

Комментарии:

1. Я только что обнаружил EventTriggers и думаю, что это правильный путь, поскольку я хочу что-то делать всякий раз, когда изменяется значение (неважно, какое это значение).

2. EventTriggers зависят от RoutedEvents, поэтому это не так просто, как просто подключиться к PropertyChanged или новому событию на вашей виртуальной машине.

Ответ №3:

Мне удалось заставить его работать с EventTriggers. Завершите приведенный ниже код. вкратце, триггер события определяет, когда изменяется привязанное значение, затем текст ненадолго становится оранжевым.

     <UserControl.Resources>
    <!-- instantiate an instance of the TimeSettingsCollection class -->
    <c:TimeSettingsCollection x:Key="TimeSettingsCollection"/>

    <Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border Name="ItemBorder" BorderBrush="Gray" BorderThickness="1" Margin="3" Padding="7" Background="Transparent">
                        <ContentPresenter />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter TargetName="ItemBorder" Property="Background" Value="LightBlue" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <DataTemplate DataType="{x:Type c:TimeSettingsItem}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="80"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Row="0" Grid.Column="0" Margin="0,0,8,0" 
                       Style="{StaticResource smallTitleStyle}">Pc Name:</TextBlock>
            <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=PcName}" 
                       Style="{StaticResource textStyleTextBlock}"/>
            <TextBlock Grid.Row="1" Grid.Column="0" Margin="0,0,8,0" 
                       Style="{StaticResource smallTitleStyle}">Time:</TextBlock>
            <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=TimeSettings.DateTime, NotifyOnTargetUpdated=True}" 
                       Style="{StaticResource textStyleTextBlock}" x:Name="timeTextBlock">
                <TextBlock.Background>
                    <SolidColorBrush Color="Transparent"/>
                </TextBlock.Background>
                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="Binding.TargetUpdated">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation
                                Storyboard.TargetName="timeTextBlock" 
                                Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)"
                                To="Orange"              
                                Duration="0:0:1"
                                AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>                    
                </TextBlock.Triggers>
            </TextBlock>
        </Grid>
    </DataTemplate>
</UserControl.Resources>


<DockPanel>
    <ListBox Name="timeListBox" ItemsSource="{Binding Source={StaticResource TimeSettingsCollection}}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True">
    </ListBox>
</DockPanel>