Guard Methods in Caliburn Micro

i have been working on fixing some of the Caliburn.Micro bugs recently.

One of the bugs was talking about the Guard Methods not firing correctly.

There are multiple ways to bind a method in your View model to a button click event for example.

        <Button Text="{Binding Delta}" x:Name="ButtonDelta">
                <EventTrigger Event="Clicked">
                    <cm:ActionMessage MethodName="CountUp" AssociatedObject="{x:Reference ButtonDelta}" >
                        <cm:Parameter Value="{Binding Source={x:Reference Count}, Path=Text}"/>

In this example we add an Action Message which is tells the button call a method called CountUp when the button is pressed.

Guard methods will fire before the click method to make sure it is ok to run the button click event. To add a Guard Method to add a method that starts with Can before the click event method name. So for this example the method name is CanCountUp.

     public bool CanCountUp(int i)
        if (i > 10)
            return false;

        if (Count < 10)
            return true;
            return false;

One thing you need to do is in the ViewModels constructor enable EnforceGuardsDuringInvocation

     public MainViewModel()
        ActionMessage.EnforceGuardsDuringInvocation = true;

There is a complete example located here