Чтобы было ясно, у меня есть UserControl с DependencyProperty что источник данных, связанный с внешним и ListBox.ItemSource привязан к внутри.
Означает ли это UserControl-х DataContext
является источником данных, а также ListBox в UserControl затем связывается с источником данных? Потому что это имело бы смысл. В противном случае, я не уверен, что вы имеете в виду, - отредактировал бы вопрос и разделил бы свой код/XAML, чтобы было немного более очевидно, с чем вы работаете?
Предполагая, что сценарий, который я изложил, на данный момент звучит как способ, и мне действительно удалось анимировать дополнения (и, предположительно, абзацы) элемента ItemsControl только в XAML, без записи обработчиков событий.
Предположим, вы связываете ItemsSource
вашего ListBox с номером ObservableCollection<YourListItemDataObjects>
. Вы можете создать DataTemplate
как следующий и назначить его в ListBox в ItemTemplate
собственности:
<DataTemplate>
<TextBlock Name="animatedTextBlock" Text="{Binding Name}">
<TextBlock.Background>
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>0.5,0.0</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>0.5,1.0</LinearGradientBrush.EndPoint>
<GradientStop Color="White" Offset="0.3"/>
<GradientStop x:Name="cellBackgroundBottomStopColor"
Color="Orange" Offset="0.9"/>
</LinearGradientBrush>
</TextBlock.Background>
<TextBlock.Triggers>
<EventTrigger SourceName="animatedTextBlock"
RoutedEvent="TextBlock.Loaded">
<BeginStoryboard Name="flashNewCell">
<Storyboard>
<ColorAnimation Storyboard.TargetName="cellBackgroundBottomStopColor"
Storyboard.TargetProperty="Color"
From="White" To="Orange"
Duration="0:0:1" AutoReverse="False"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger SourceName="animatedTextBlock"
RoutedEvent="TextBlock.MouseUp">
<RemoveStoryboard BeginStoryboardName="flashNewCell" />
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
</DataTemplate>
Вы увидите, что DataTemplate
вызовет ListItems оказывать в TextBoxes привязанных к Name
собственности объектов в вашей ObservableCollection
(измените это свойство на все, что подходит в вашем случае, очевидно).
Комплексный бит - это анимация. Обратите внимание: EventTrigger
, RoutedEvent
Недвижимость "TextBlock.Loaded". Это событие будет срабатывать всякий раз, когда элемент добавляется в ObservableCollection
, связанный с ListBox, поскольку это вызывает создание нового элемента ListBoxItem - и, следовательно, будет создан новый TextBlock, чье событие Loaded
.
Аналогично, при удалении элемента происходит событие Unloaded, которое вы можете активировать.
Также обратите внимание, что свойство Storyboard.TargetName
ColorAnimation
относится к названию, которое мы указали во втором GradientStop
, составляющем фон TextBlock. Это говорит анимации, какой элемент в визуальном дереве TextBlock изменяется - типичные анимации WPF всегда применяются к свойствам зависимостей визуальных элементов.
Применение animation на EventTrigger позволяет применять эффекты (в этом случае цвета градиента, но вы можете играть с непрозрачностью, чтобы также делать затухания и затухания), когда его связанный источник данных изменено.
в примере Второй EventTrigger
активируется на MouseUp
событие, которое произойдет, когда пользователь нажимает на эту TextBlock, и он удаляет анимацию, мы применили, когда TextBlock был загружен (обратите внимание на установку AutoReverse="False"
на этой первой анимации, который заставляет его поддерживать свое конечное состояние, пока мы его явно не удалим).
Теперь у нас есть ListBox, чьи элементы «светятся» в течение нескольких секунд, когда они добавлены, и которые поддерживают выделенный цвет, пока мы не нажмем на них.
Очевидно, что это только отправная точка - DataTemplates и Animations - это глубокие темы, которые вы, возможно, захотите исследовать дальше. Но я надеюсь, что вы найдете этот полезный пример мощных возможностей привязки WPF и их возможностей, позволяющих вам определять свой пользовательский интерфейс только с помощью XAML.
Это односторонняя привязка. – Sheridan
Если это односторонний источник, этот метод по-прежнему применяется для обновления пользовательского интерфейса из базового источника данных. –
Мой тип данных реализует INotifyPropertyChanged, но проблема не в проблеме «не обновляемого интерфейса», это «неспособность реагировать на изменения в связанном источнике данных из-за недостатка кода». – Sheridan