Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Behavior and Trigger in WPF/Silverlight

0.00/5 (No votes)
11 Jun 2012 2  
Behaviors and Triggers explained with samples.

Introduction

Behavior introduced in Blend 3 (System.Windows.interactivity.dll). The main use of Behavior is to provide additional functionalities and extensibility to controls without writing code in the code-behind.

Behavior

This can be used to change the behavior of the control independent of ViewModel. For example in the below sample, the Foreground color of check box changed based on Check box state using behavior.

Create a class by inheriting from Behavior and override OnAttached and OnDetaching methods. In the OnAttached you can hook the event and in OnDetaching, you have to unhook the events hooked in the OnAttached. The action be done in event handler delegate.

class CheckBoxBehavior : Behavior<CheckBox>
{
    protected override void OnAttached()
    {
        this.AssociatedObject.Click += AssociatedObject_Click;
    }

    void AssociatedObject_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        if (AssociatedObject.IsChecked == true)
            this.AssociatedObject.Foreground = Brushes.Green;
        else if (this.AssociatedObject.IsChecked == false)
            this.AssociatedObject.Foreground = Brushes.Red;
        else
            this.AssociatedObject.Foreground = Brushes.Black;
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.Click -= AssociatedObject_Click;
    }
}

And in XAML, the created behavior can be added to control through the Interaction.Behaviors attached property.

<CheckBox x:Name="Checkbox"
            Content="Behaviour"
            IsThreeState="True">
    <i:Interaction.Behaviors>
        <local:CheckBoxBehavior />
    </i:Interaction.Behaviors>
</CheckBox>

Using behavior we don’t have to write code behind code. It will help you to develop you application in MVVM.

TriggerAction

This is same as Behavior. The only difference is the event cab be specified in XAML itself. It is not required to override OnAttached and OnDetaching. You have to just override Invoke method. Invoke method will be called when the particular event invoked. The event arguments will be passed as parameter to Invoke method override.

public class TriggerActionClick : TriggerAction<CheckBox>
{
    protected override void Invoke(object parameter)
    {
        if (AssociatedObject.IsChecked == true)
            this.AssociatedObject.Foreground = Brushes.Green;
        else if (this.AssociatedObject.IsChecked == false)
            this.AssociatedObject.Foreground = Brushes.Red;
        else
            this.AssociatedObject.Foreground = Brushes.Black;
    }
}

In XAML, specify the EventName through EventTrigger.

<CheckBox Content="TriggerAction" IsThreeState="True">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <local:TriggerActionClick />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</CheckBox>

TargetedTriggerAction

Behavior and TargetTrigger are used to extend the functionality of particular control. TargettedTriggerAction can be used to change the behavior of another control (Target control) based on the actions in the Associated Control. In the below sample, the TextBlock content changed based on checkbox state change.

In XAML, specify EventName using EventTrigger and the Target using TergetedTriggerAction. The Target can be specified using the TargetObject or TargetName property in TargetedTriggerAction. In the below sample TargetObject used. The TagetObject property was added in 4.0 version only. You can’t find this property in the 3.5 version.

<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <CheckBox IsThreeState="True">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <local:TargetedTriggerActionCheckBox TargetObject="{Binding ElementName=MyTextBlock}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </CheckBox>
    <TextBlock x:Name="MyTextBlock"
                Grid.Column="1"
                Margin="5,0"
                Text="False" />
</Grid>

TargetTriggerAction for Checkbox created by inheriting from TargetTriggerAction. T is the Target. Here the Target is TextBlock. When the action takes place, the invoke method will be called with EventArgs. You can do the necessary things here. You can access the check box in TriggerAction by typecasting the AssociatedObject.

public class TargetedTriggerActionCheckBox : TargetedTriggerAction<TextBlock>
{
    protected override void Invoke(object parameter)
    {
        this.Target.Text = (this.AssociatedObject as CheckBox).IsChecked != null ?
            (this.AssociatedObject as CheckBox).IsChecked.ToString() : "Null";
    }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here