UserControl ImageButton, clickhandler and x:Name

Topics: Actions & Coroutines, Bootstrappers & IoC, Getting Started, UI Architecture
Apr 5, 2013 at 9:15 PM
I have created a very simple user control, an ImageButton
    <UserControl x:Class="SampleApp.Controls.ImageButton"
                 Name="ImageButtonControl"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 d:DesignHeight="300"
                 d:DesignWidth="300"
                 mc:Ignorable="d">
        <Button>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="1*" />
                    <RowDefinition Height="6*" />
                    <RowDefinition Height="2*" />
                    <RowDefinition Height="1*" />
                </Grid.RowDefinitions>
                <Image Grid.Row="1" Source="{Binding ElementName=ImageButtonControl, Path=Image}" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
                <TextBlock Grid.Row="2" Text="{Binding ElementName=ImageButtonControl, Path=Text}" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
            </Grid>
        </Button>
    </UserControl>
With code behind:
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    
    namespace SampleApp.Controls
    {
        /// <summary>
        /// Interaction logic for ImageButton.xaml
        /// </summary>
        public partial class ImageButton : UserControl
        {
            public ImageButton()
            {
                InitializeComponent();
            }
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            public static readonly DependencyProperty TextProperty =
              DependencyProperty.Register("Text", typeof(string), typeof(ImageButton), new UIPropertyMetadata(""));
    
            public ImageSource Image
            {
                get { return (ImageSource)GetValue(ImageProperty); }
                set { SetValue(ImageProperty, value); }
            }
    
            public static readonly DependencyProperty ImageProperty =
               DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton), new UIPropertyMetadata(null)); 
        }
    }
Now I want to use that in my little sample application like
    xmlns:controls="clr-namespace:SampleApp.Controls"
    
    <controls:ImageButton Grid.Row="1"
                                  Grid.Column="1"
                                  Margin="2"
                                  Image="/Images/link.png"
                                  Text="DoSomething">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <cal:ActionMessage MethodName="DoSomething" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </controls:ImageButton>
If I give it a x:Name, like
<controls:ImageButton x:Name="DoSomething" 

e.g. DoSomething the method DoSomething with that name is directly called when the view is shown, i.e. when I active the viewmodel that contains that button, just like I click the Button (if it was a normal button and not a usercontrol, it would work that way), but the button-click handler is never called on clicking.

Now I tried to add an ActionMessage as seen above, but it does not work either...

What is wrong here?

Just if it is interesting: I use caliburn.micro 1.5 with Unity in the AppBootstrapper.