klar zu sein, habe ich ein Benutzersteuerelement mit a DependencyProperty, dass eine Datenquelle extern gebunden ist und ein ListBox.ItemSource an intern gebunden.
Bedeutet dies das Usercontrol DataContext
die Datenquelle und die ListBox innerhalb die Usercontrol dann an die Datenquelle gebunden ist? Weil das Sinn machen würde. Sonst bin ich nicht sicher, was du meinst - würdest du die Frage bearbeiten und etwas von deinem Code/XAML teilen, damit es etwas offensichtlicher ist, mit was du arbeitest?
Angenommen, das Szenario skizzierte, ein ObservableCollection
klingt wie der Weg zu gehen, und ich konnte Additionen zu (und vermutlich auch entfernen) von ItemsControl in XAML tatsächlich animieren, ohne Event-Handler zu schreiben.
Nehmen wir an, Sie binden die ItemsSource
Ihrer ListBox an eine ObservableCollection<YourListItemDataObjects>
. Sie können eine DataTemplate
wie folgt erstellen und an die ItemTemplate
Eigenschaft List-Box zuordnen:
<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>
Sie werden sehen, dass die DataTemplate
wird die Listitems verursachen als Textfelder an die Name
Eigentum der Objekte in Ihrem ObservableCollection
gebunden zu machen (Ändere diese Eigenschaft natürlich in dem Fall, der in deinem Fall angemessen ist).
Das komplexe Bit ist die Animation. Beachten Sie die EventTrigger
, deren RoutedEvent
Eigenschaft ist "TextBlock.Loaded". Dieses Ereignis wird ausgelöst, wenn ein Element an die an die ListBox gebundene ObservableCollection
hinzugefügt wird, da dies zur Erstellung eines neuen ListBoxItem führt - und somit zu einem neuen TextBlock, dessen Loaded
-Ereignis ausgelöst wird.
Ebenso gibt es ein Unloaded-Ereignis, das beim Entfernen eines Elements ausgelöst werden kann.
Beachten Sie auch, dass die Storyboard.TargetName
Eigenschaft der bezieht sich auf den Namen gaben wir die zweite GradientStop
den TextBlock Hintergrund bilden. Dies teilt der Animation mit, welches Element in der visuellen Struktur des TextBlocks geändert werden soll - typische WPF-Animationen werden immer auf die Abhängigkeitseigenschaften von visuellen Elementen angewendet.
Durch Anwenden eines animation auf einen EventTrigger können Sie Effekte (Farbverlaufsfarben in diesem Fall, aber Sie können mit Opazität auch Fade-Ins und Fade-Outs spielen) auf ein Steuerelement anwenden, wenn seine gebundene Datenquelle ist verändert.
Die zweiten EventTrigger
im Beispiel auf dem MouseUp
Ereignis aktiviert, die auftreten, wenn der Benutzer auf diesem Textblock klickt, und es entfernt die Animation, die wir angewandt, wenn der Textblock (man beachte die AutoReverse="False"
Einstellung an dieser ersten Animation geladen wurde, wodurch es seinen Endstatus beibehält, bis wir es explizit entfernen.
Wir haben jetzt eine ListBox, deren Elemente für einige Sekunden leuchten, wenn sie hinzugefügt werden, und die eine hervorgehobene Farbe beibehalten, bis wir sie anklicken.
Offensichtlich ist dies nur ein Ausgangspunkt - DataTemplates und Animationen sind beide tiefere Themen, die Sie möglicherweise weiter erforschen möchten. Aber ich hoffe, Sie finden dies als ein hilfreiches Beispiel für die leistungsstarken Bindungsfunktionen von WPF und deren Potenzial, mit denen Sie Ihre Benutzeroberfläche nur durch XAML definieren können.
Es ist eine Einwegbindung. – Sheridan
Wenn es sich um eine Einwegquelle handelt, gilt diese Technik weiterhin für die Aktualisierung der Benutzeroberfläche von der zugrunde liegenden Datenquelle. –
Mein Datentyp implementiert INotifyPropertyChanged, aber das Problem ist nicht ein Problem "UI nicht aktualisieren", es ist ein "nicht in der Lage, auf die Änderungen in der gebundenen Datenquelle von Code behind" Problem zu reagieren. – Sheridan