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); } } } }