这一节是对.NET2.0事件绑定技术的总结。
    .NET事件绑定是基于Observer模式的,关于这部分见我的《CLR笔记10.事件》。在.NET2.0中,对Observer进行了一次包装,可以引用System.Component命名空间,实现INotifyPropertyChanged接口,可以获得事件PropertyChanged,以及PropertyChangedEventArgs。于是在这套体系下,事件机制事先搭建好了。
namespace System.ComponentModel
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_04{
    
public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

    
public interface INotifyPropertyChanged
    
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_04{
        
event PropertyChangedEventHandler PropertyChanged;
    }


    
public class PropertyChangedEventArgs : EventArgs
    
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_04{
        
public PropertyChangedEventArgs(string propertyName);

        
public virtual string PropertyName WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_04get; }
    }

}

下面看一个例子,这个例子将贯穿本章。

XAML部分:

<Window WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26>
  
<Grid>
    WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26
    
<TextBlock WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26>Name:</TextBlock>
    
<TextBox x:Name="nameTextBox" WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26 />
    
<TextBlock WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26>Age:</TextBlock>
    
<TextBox x:Name="ageTextBox" WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26 />
    
<Button x:Name="birthdayButton" WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26>Birthday</Button>
  
</Grid>
</Window>

后台代码部分:
    public partial class Window1 : System.Windows.Window
    
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
        Person person 
= new Person("Tom"9);

        
public Window1()
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            InitializeComponent();

            
this.nameTextBox.Text = person.Name;
            
this.ageTextBox.Text = person.Age.ToString();

            
// Watch for changes in the controls
            this.nameTextBox.TextChanged += nameTextBox_TextChanged;
            
this.ageTextBox.TextChanged += ageTextBox_TextChanged;

            person.PropertyChanged 
+= person_PropertyChanged;

            
this.birthdayButton.Click += birthdayButton_Click;
        }


        
void person_PropertyChanged(object sender, PropertyChangedEventArgs e)
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
switch (e.PropertyName)
            
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
                
case "Name":
                    
this.nameTextBox.Text = person.Name;
                    
break;

                
case "Age":
                    
this.ageTextBox.Text = person.Age.ToString();
                    
break;
            }

        }


        
void nameTextBox_TextChanged(object sender, TextChangedEventArgs e)
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            person.Name 
= nameTextBox.Text;
        }


        
void ageTextBox_TextChanged(object sender, TextChangedEventArgs e)
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
int age = 0;
            
if (int.TryParse(ageTextBox.Text, out age))
            
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
                person.Age 
= age;
            }

        }


        
private void birthdayButton_Click(Object sender, RoutedEventArgs e)
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
++person.Age;

            MessageBox.Show(
              
string.Format(
                
"Happy Birthday, {0}, age {1}!",
                person.Name,
                person.Age),
              
"Birthday");
        }

    }

辅助类:

    public class Person : INotifyPropertyChanged
    
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
        
public Person() WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{ }
        
public Person(string name, int age)
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
this.name = name;
            
this.age = age;
        }


        
string name;
        
public string Name
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
get WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26return this.name; }
            
set
            
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
                
this.name = value;
                OnPropertyChanged(
"Name");
            }

        }


        
int age;
        
public int Age
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
get WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26return this.age; }
            
set
            
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
                
this.age = value;
                OnPropertyChanged(
"Age");
            }

        }



        
INotifyPropertyChanged Members#region INotifyPropertyChanged Members

        
public event PropertyChangedEventHandler PropertyChanged;

        
#endregion


        
protected void OnPropertyChanged(string propName)
        
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
            
if (this.PropertyChanged != null)
            
WPF笔记(4.1 旧有事件绑定)——Data Binding_事件机制_26{
                PropertyChanged(
thisnew PropertyChangedEventArgs(propName));
            }

        }


    }

显示效果: