Search code examples
c#wpfeventsicommand

Cannot pass/bind click event to WPF user control


I'm trying to pass a click event to an button in a WPF user control.

the xaml part of my user control:

 <UserControl>
    <Grid>
        <Button Name="btnlrg"
            Command="{Binding Command, RelativeSource={RelativeSource AncestorType={x:Type local:ButtonLarge}}}"
            Click="{Binding Click, RelativeSource={RelativeSource AncestorType={x:Type local:ButtonLarge}}}">
            <Button.Content>
                <StackPanel Orientation="Horizontal">
                    <!-- shortened -->
                </StackPanel>
            </Button.Content>
        </Button>
    </Grid>
</UserControl>

the c# part of my user control:

public partial class ButtonLarge : UserControl
{
    public ButtonLarge()
    {
        InitializeComponent();

    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
      DependencyProperty.Register("Text", typeof(string), typeof(ButtonLarge), 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(ButtonLarge), new UIPropertyMetadata(null));


    //Make Commands available in UserControl
    public static readonly DependencyProperty CommandProperty = 
        DependencyProperty.Register("Command", typeof(ICommand), typeof(ButtonLarge));

    public ICommand Command
    {
        get { return (ICommand)GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }

    //Make Click Event available in UserControl
    public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonLarge));

     public event RoutedEventHandler Click
    {
        add { btnlrg.AddHandler(ButtonLarge.ClickEvent, value); }
        remove { btnlrg.RemoveHandler(ButtonLarge.ClickEvent, value); }
    }

}

usage of the user-control:

<ui:ButtonLarge Image="{StaticResource Icon}" Text="Ok" Click="newClickEvent"/>

I can not go on here:( Can someone please help me?


Solution

  • You might simply make the Button accessible by a member variable:

    <Button x:Name="button" .../>
    

    Then declare a Click event in the UserControl and add the handler directly to the Button:

    public event RoutedEventHandler Click
    {
        add { button.AddHandler(ButtonBase.ClickEvent, value); }
        remove { button.RemoveHandler(ButtonBase.ClickEvent, value); }
    }
    

    Or like this:

    public static readonly RoutedEvent ClickEvent =
        ButtonBase.ClickEvent.AddOwner(typeof(ButtonLarge));
    
    public event RoutedEventHandler Click
    {
        add { button.AddHandler(ClickEvent, value); }
        remove { button.RemoveHandler(ClickEvent, value); }
    }