Bind Command In WPF Using MVVM


Answer :

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.


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?