<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); } } }