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