Bind the Button to a Command

image_pdfimage_print


   
  
<Window x:Class="WpfApplication1.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="WPF" Height="240" Width="300">
    <StackPanel>
        <TextBlock Text="First Name"/>
        <TextBox   Text="{Binding Path=FirstName}"/>
        <TextBlock Text="Age"/>
        <TextBox Text="{Binding Path=Age}"/>
        
        <Button Command="{Binding Path=Add}" Content="Add"/>
        <ComboBox x:Name="cboOccupation" IsEditable="False" Width="100">
             <ComboBoxItem>Student</ComboBoxItem>
             <ComboBoxItem>Skilled</ComboBoxItem>
             <ComboBoxItem>Professional</ComboBoxItem>
        </ComboBox>
        <Button Command="{Binding Path=SetOccupation}" CommandParameter="{Binding ElementName=cboOccupation, Path=Text}" Content="Set Occupation"/>
        <TextBlock Text="Status"/>
        <TextBlock Text="{Binding Path=Status, UpdateSourceTrigger=PropertyChanged}"/>
        
    </StackPanel>
</Window>

//File:Window.xaml.cs

using System.Windows;
using System;
using System.ComponentModel;
using System.Windows.Input;
namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            this.DataContext = new Employee(){FirstName = "A"};
        }
    }
    public class Employee : INotifyPropertyChanged
    {
        private string firstName;
        private int age;
        private string occupation;
        private string status;

        private AddEmployeeCommand addEmployeeCommand;
        private SetOccupationCommand setOccupationCommand;
        public string Status
        {
            get
            {
                return status;
            }
            set
            {
                if(status!= value)
                {
                    status= value;
                    OnPropertyChanged("Status");
                }
            }
        }
        public string FirstName
        {
            get
            {
                return firstName;
            }
            set
            {
                if(firstName != value)
                {
                    firstName = value;
                    OnPropertyChanged("FirstName");
                }
            }
        }
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if(this.age != value)
                {
                    this.age = value;
                    OnPropertyChanged("Age");
                }
            }
        }
        public string Occupation
        {
            get
            {
                return occupation;
            }
            set
            {
                if(this.occupation != value)
                {
                    this.occupation = value;
                    OnPropertyChanged("Occupation");
                }
            }
        }
        public AddEmployeeCommand Add
        {
            get
            {
                if(addEmployeeCommand == null)
                    addEmployeeCommand = new AddEmployeeCommand(this);

                return addEmployeeCommand;
            }
        }
        public SetOccupationCommand SetOccupation
        {
            get
            {
                if(setOccupationCommand == null)
                    setOccupationCommand = new SetOccupationCommand(this);

                return setOccupationCommand;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if(this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class AddEmployeeCommand : ICommand
    {
        private Employee person;

        public AddEmployeeCommand(Employee person)
        {
            this.person = person;

            this.person.PropertyChanged += new PropertyChangedEventHandler(person_PropertyChanged);
        }

        private void person_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if(CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }
        public bool CanExecute(object parameter)
        {
            if(!string.IsNullOrEmpty(person.FirstName))
               if(person.Age > 0)
                    if(string.IsNullOrEmpty(person.Status))
                            return true;

            return false;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            person.Status = string.Format("Added {0}", person.FirstName);
        }
    }

    public class SetOccupationCommand : ICommand
    {
        private Employee person;

        public SetOccupationCommand(Employee person)
        {
            this.person = person;

            this.person.PropertyChanged += new PropertyChangedEventHandler(person_PropertyChanged);
        }

        private void person_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if(CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }

        public bool CanExecute(object parameter)
        {
            if(!string.IsNullOrEmpty(parameter as string))
                if(!string.IsNullOrEmpty(person.Status))
                    return true;

            return false;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            person.Occupation = parameter.ToString();

            person.Status = string.Format("Added {0},{1}", person.FirstName, person.Occupation);
        }
    }
}