17

I have a normal Button and TextBox in a WPF-Window and I want a Template for the Button with a EventTrigger that listens to Button.Click and then sets a boolean-property of the TextBox. No code-behind.

Something like this:

<ControlTemplate.Triggers>
  <EventTrigger SourceName="MyButton" RoutedEvent="Button.Click">
    <Setter TargetName="MyTextBox" Property="Focusable" Value="False" />
  </EventTrigger>
Andreas Zita
  • 7,232
  • 6
  • 54
  • 115

2 Answers2

18

Here is a sample that sets and clears Focusable on a TextBox from an EventTrigger.
Hopefully you can adapt this example to your situation.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox 
        x:Name="tb"
        Grid.Row="0"
        Text="Here is some sample text">
    </TextBox>
    <Button 
        x:Name="btnFocusTrue"
        Grid.Row="1"
        Content="Set True">
    </Button>
    <Button 
        x:Name="btnFocusFalse"
        Grid.Row="2"
        Content="Set False">
    </Button>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btnFocusTrue">
            <BeginStoryboard Name="FocusTrueStoryboard">
                <Storyboard >
                    <BooleanAnimationUsingKeyFrames
                        Storyboard.TargetName="tb"
                        Storyboard.TargetProperty="(TextBox.Focusable)">
                        <DiscreteBooleanKeyFrame
                            KeyTime="00:00:01"
                            Value="True" />
                    </BooleanAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btnFocusFalse">
            <BeginStoryboard Name="FoucsFalseStoryboard">
                <Storyboard >
                    <BooleanAnimationUsingKeyFrames
                        Storyboard.TargetName="tb"
                        Storyboard.TargetProperty="(TextBox.Focusable)">
                        <DiscreteBooleanKeyFrame
                            KeyTime="00:00:01"
                            Value="False" />
                    </BooleanAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>
</Grid>
Shehary
  • 9,926
  • 10
  • 42
  • 71
Zamboni
  • 7,897
  • 5
  • 43
  • 52
  • 2
    Ahhh missed the Discrete*KeyFrame-classes... its a solution to my problem but its a lot of xaml for such a simple task... i wish there where a shorter version – Andreas Zita Oct 07 '10 at 06:32
  • 1
    How can we set the custom dependency property value in the event trigger ?? – Ujjwal27 Dec 29 '15 at 13:25
0

You can make use of behaviours to achieve your desired outcome: First, add the reference:

xmlns:b="http://schemas.microsoft.com/xaml/behaviors"

Afterwards, you can assign a Value to any Property of your choosing using an Interaction Trigger and a ChangePropertyAction:

<Button>
    <b:Interaction.Triggers>
        <b:EventTrigger EventName="Click">
            <b:ChangePropertyAction PropertyName="Focusable" Value="False"/>
        </b:EventTrigger>
    </b:Interaction.Triggers>
</Button>

You can also use this to change properties in your DataContext by specifying a TargetObject like so:

<b:ChangePropertyAction TargetObject="{Binding MemberOfYourDataContext}" PropertyName="PropertyOfYourDataContextMember" Value="StaticValueOrBinding"/>
jeanluc162
  • 428
  • 1
  • 10