Bind command in WPF using MVVM
You can bind the Command property of the button to any property that returns ICommand. Prism implements a nice convenient command called DelegateCommand that is very easy to use (here is a knock-off of it):
public ICommand MyButtonClickCommand
{
get { return new DelegateCommand<object>(FuncToCall, FuncToEvaluate); }
}
private void FuncToCall(object context)
{
//this is called when the button is clicked
}
private bool FuncToEvaluate(object context)
{
//this is called to evaluate whether FuncToCall can be called
//for example you can return true or false based on some validation logic
return true;
}
<Button x:Name="myButton" Command="{Binding MyButtonClickCommand}" />
The CodeProject example How to use Commands in WPF has a very similar example with code that you can easily work through. The previous Stack Overflow question has an example using RoutedCommands that are statically bound to: How to bind Close command to a button, and How to bind WPF button to a command in ViewModelBase? has a slightly more advanced example.
Seeing a lot of answers implementing this ICommand interface, I suggest a simpler option, which is to use the built in System.Windows.Input
Here's an example:
Xaml View:
<Window
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"
x:Class="SomeDialog"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterOwner"
ResizeMode="CanResizeWithGrip">
<StackPanel>
<Button Width="Auto" Command="{Binding ClearCommand}" Content="Clear"/>
</StackPanel>
</Window>
View Code behind:
using System.Windows;
public partial class SomeDialog : Window
{
public SomeDialog()
{
var vm = new ViewModel();
DataContext = vm;
CommandBindings.AddRange(vm.Commands);
InitializeComponent();
}
}
View model:
using System.Windows.Input;
public class ViewModel : ViewModelBase
{
readonly CommandBindingCollection commands = new CommandBindingCollection();
public static RoutedUICommand ClearCommand { get; set; } = new RoutedUICommand("Clear", "ClearCommand", typeof(ErrorDialog));
public CommandBindingCollection Commands
{
get
{
commands.Add(new CommandBinding(ClearCommand, OnClearExecuted);
return commands;
}
}
void OnClearExecuted(object sender, ExecutedRoutedEventArgs e)
{
view.DialogResult = true; //Indicate things
view.Close(); //Close the window
}
}
Call like this:
public void OpenSomeDialog()
{
var dialog = new SomeDialog() {Owner = Application.Current.MainWindow};
bool? b = dialog.ShowDialog();
if (b != null && (bool) b)
//Do things
}
Now go dialog things.