Bind command in WPF using MVVM

.net, c#, mvvm, wpf

Solution

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.

Problem

I am learning MVVM and WPF. I have a `xaml` file in my project and which has a simple click event handler in the code behind. Now I want to do the same in MVVM. I read a lot of articles and also read many answers in sof. But still unable to do this. Can anyone please give a simple example in which a button click event is done in MVVM. Edit ``` <Window x:Class="WhiteBalance.BaseCalWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:uc="clr-namespace:NumberUpDownControl;assembly=NumberUpDownControl" xmlns:viewn="clr-namespace:WhiteBalance.ViewModels" Title="RefImgSettingWindow" Height="900" Width="1000" ResizeMode="NoResize" BorderThickness="4"> <Window.Resources> <viewn:DashBoardViewModel x:Key="demokey"></viewn:DashBoardViewModel> </Window.Resources> <Grid x:Name="gdParent" DataContext="{StaticResource demokey}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="490" /> <ColumnDefinition Width="488*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="300" /> <RowDefinition Height="300" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Grid.Column="0"> <Label Content="{Binding Path=NAME,Mode=TwoWay}" Height="28" Name="lblTest" /> <Button Content="Capture" Height="23" Name="btnCapture" Width="75" Command="{Binding Path=SaveCommand}" Canvas.Left="94" Canvas.Top="254" /> </StackPanel> </Grid> </Window> namespace WhiteBalance.ViewModels { public class DashBoardViewModel: ObservableObject { private string _name = "dsqdasd"; public string NAME { get { return _name; } set { _name = value; } } public ICommand SaveCommand { get; set; } private bool CanExecuteSaveCommand() { return true; // !string.IsNullOrEmpty(LastName); } private void CreateSaveCommand() { SaveCommand = new RelayCommand(SaveExecute, CanExecuteSaveCommand); } public void SaveExecute() { //Person.Save(_newPerson); NAME = "Changed Name"; } public DashBoardViewModel() { //objModel.TestText = "This will change"; NAME = "TestName"; } } } ``` Thanks in advance.

Original source

Related problems