Search code examples
wpfmvvmmvvm-lightcaliburn.microrelaycommand

Same method for multiple controls when using Caliburn.Micro


In WPF MVVM application, I need same functionality for multiple controls - for example certain button does same thing as certain menu item. It is piece of cake with MVVM Light's RelayCommand, but I am now using Caliburn.Micro, where almost everything is based on conventions. So two controls can not have same x:Name="AddItem", which is used by CM to determine method for executing in ViewModel. Is there any simple way to solve this?


Solution

  • Yes, it's simple, but verbose. You need to use the "long format". Let's say you have one method IncrementCount on your ViewModel:

    // Handling event
    public void IncrementCount()
    {
        Count++;
    }
    

    And your View has:

    <Button Name="ButtonOne">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <cal:ActionMessage MethodName="IncrementCount" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
    
    <Button Name="ButtonTwo">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <cal:ActionMessage MethodName="IncrementCount" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
    

    Both buttons will call your IncrementCount method.

    EDIT

    Add these namespaces

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:cal="http://www.caliburnproject.org"
    

    You may see this Caliburn starting project using the snippets above.