Search code examples
c#wpfdata-bindingicommand

How to call Command from within C# code instead of by binding UI-control to it?


I am working on a C#-WPF-App.

When pressing a certain button in a window, a module is loaded. This happens because the Command Property of the button is bound to the LoadModuleCommand in the class "ConfigureViewModel":

<Button Command="{Binding LoadModuleCommand}" Margin="10,10,10,10" Grid.Column="1" Content="Add Module" Grid.Row="0" />

For some reason, which is not important for this question, I now also want to call the same command (i.e. the LoadModuleCommand) from the MainViewModel.cs-file, if a certain condition is true:

 if (id.Equals(Module.Id.ToString()))
        {
             //call the LoadModuleCommand

        }

I knew what I had to do, if I had to bind the LoadModuleCommand to a second UI-control. But how do I simply call the command from within c#-code?


Solution

  • There are several ways to solve your problem.

    One approach is to take the bound data context and cast it. Now you are able to execute the command like

    var viewModel = (ConfigureViewModel)DataContext;
    if (viewModel.LoadModuleCommand.CanExecute(null))
    {
        viewModel.LoadModuleCommand.Execute(null);
    }
    

    Note that you need to know the type of the data context to cast it correctly. Use an interface if there are several types possible.

    A second way is to name the button (e.g. <Button x:Name="loadModuleButton" .../>) and raise the clicked event like

    loadModuleButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));