Behaviors in WPF und
Silverlight
Frank Dzaebel,
erstellt am: 24.07.2010,
zuletzt geändert: 24.07.2010
Kategorie:WPF/Silverlight, .NET-Version:4.0,
[Download]
Es gibt sehr viele gute Beschreibungen, Beispiele und
Einsatzszenarien der "Behaviors" (Verhalten) in WPF und Silverlight. Sie sind extrem
leistungsfähig, anpassbar, flexibel, sauber in der Implementierung und sehr MVVM-freundlich
(über Eigenschaften ohne CodeBehind im ViewModel) und in Blend und VS 2010 über
Designer nutzbar. Man benötigt kein Produkt "Microsoft Blend", um
in WPF "Behaviors" zu benutzen, oder eigene selber zu erstellen. Sie werden über
das redistributierbare "Blend SDK" aus dem "System.Windows.Interactivity" - Namensraum
einsetzbar.
Hier nur eine kleine Link-Sammlung und eine Beispiel-Implementierung
für ein Silverlight-Behavior, das ein Binding einer Control-Instanz (über
den ElementName) an eine ZielEigenschaft MVVM-freundlich und "blendable" über XAML ermöglicht:
Links:
[Working
with behaviors - MSDN]
[Creating
custom behaviors (WPF)]
[Creating
custom behaviors (Silverlight)]
[System.Windows.Interactivity
(Blend SDK 4 - Silverlight)]
[System.Windows.Interactivity (Blend SDK 4 - WPF)]
[CompositeWPF
- Release: Prism
4 - Drop 4 - dort
Verzeichnis "MVVM RI"->u.a.: CallMethodAction und "MVVM.Client\Infrastructure\Behaviors"]
[Blend Behaviors -
David Hill's WebLog - Site Home - MSDN Blogs]
[A
Look at Some Advanced Behaviors Features - Expression Blend and Design - Site
Home - MSDN Blogs]
[Behaviors
and Triggers in Silverlight 3] [electric beach »
Blend 3: Triggers, Actions, Behaviors]
[Shawn Wildermuth -
Writing Behaviors for Silverlight 3 - Part 2]
[kirupaBlog – If it isn’t broken, take it apart and fix it! »
Behaviors] [kirupa.com -
Introduction to Behaviors, Page 1]
[Using
a Behavior to magnify your WPF applications]
[Silverlight
3.0 LetItSnowBehavior - Reflection IT] [Behaviors-Search
in: Microsoft Expression Community Gallery]
[Veracity Solutions Blog »
Create A Snapping Slider In Blend Using Behaviors (Silverlight 3 or WPF)]
MainPage.xaml:
<local:GridControl
AutoGenerateColumns="False" Height="100" HorizontalAlignment="Left"
Margin="49,106,0,0" x:Name="myGrid" VerticalAlignment="Top"
Width="120" BorderThickness="3">
<i:Interaction.Behaviors>
<local:InstanzBehavior ElementName="myDock"
ZielEigenschaftsname="TheDock"/>
</i:Interaction.Behaviors>
</local:GridControl>
MainPage.xaml.cs:
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
namespace SLPropertySelf
{
public class InstanzBehavior : Behavior<DependencyObject>
{
public InstanzBehavior() { }
protected override void OnAttached()
{
base.OnAttached();
var ao = AssociatedObject as FrameworkElement;
if (ao == null) return;
ao.Loaded += AO_Loaded;
}
void AO_Loaded(object sender, RoutedEventArgs e)
{
UserControl root = Application.Current.RootVisual as UserControl;
object elementInstanz = root.FindName(ElementName);
PropertyInfo pi = AssociatedObject.GetType().GetProperty(ZielEigenschaftsname);
pi.SetValue(AssociatedObject, elementInstanz, null);
}
protected override void OnDetaching()
{
base.OnDetaching();
var ao = AssociatedObject as FrameworkElement;
if (ao == null) return;
ao.Loaded -= AO_Loaded;
}
/// <summary>Name des Objektes, das an die ZielEigenschaftsname-Eigenschaft
/// des Ausgangsobjektes gebunden werden soll.
/// </summary>
public static readonly DependencyProperty ElementNameProperty =
DependencyProperty.Register("ElementName",
typeof(string), typeof(InstanzBehavior),
new PropertyMetadata(null));
/// <summary>Name des Objektes, das an die ZielEigenschaftsname-Eigenschaft
/// des Ausgangsobjektes gebunden werden soll.
/// </summary>
public string ElementName
{
get { return GetValue(ElementNameProperty) as string; }
set { SetValue(ElementNameProperty, value); }
}
/// <summary>Der Eigenschaftsname des Zielobjektes, dem die Quellinstanz zugewiesen wird.
/// </summary>
public static readonly DependencyProperty ZielEigenschaftsnameProperty =
DependencyProperty.Register("ZielEigenschaftsnameProperty",
typeof(string), typeof(InstanzBehavior), new PropertyMetadata(null));
/// <summary>Der Eigenschaftsname des Zielobjektes, dem die Quellinstanz zugewiesen wird.
/// </summary>
public string ZielEigenschaftsname
{
get { return GetValue(ZielEigenschaftsnameProperty) as string; }
set { SetValue(ZielEigenschaftsnameProperty, value); }
}
}
}