WPF笔记(4.1 旧有事件绑定)——Data Binding
这一节是对.NET2.0事件绑定技术的总结。
.NET事件绑定是基于Observer模式的,关于这部分见我的《CLR笔记10.事件》。在.NET2.0中,对Observer进行了一次包装,可以引用System.Component命名空间,实现INotifyPropertyChanged接口,可以获得事件PropertyChanged,以及PropertyChangedEventArgs。于是在这套体系下,事件机制事先搭建好了。
后台代码部分:
.NET事件绑定是基于Observer模式的,关于这部分见我的《CLR笔记10.事件》。在.NET2.0中,对Observer进行了一次包装,可以引用System.Component命名空间,实现INotifyPropertyChanged接口,可以获得事件PropertyChanged,以及PropertyChangedEventArgs。于是在这套体系下,事件机制事先搭建好了。
namespace System.ComponentModel
{
public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);
public interface INotifyPropertyChanged
{
event PropertyChangedEventHandler PropertyChanged;
}
public class PropertyChangedEventArgs : EventArgs
{
public PropertyChangedEventArgs(string propertyName);
public virtual string PropertyName { get; }
}
}
{
public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);
public interface INotifyPropertyChanged
{
event PropertyChangedEventHandler PropertyChanged;
}
public class PropertyChangedEventArgs : EventArgs
{
public PropertyChangedEventArgs(string propertyName);
public virtual string PropertyName { get; }
}
}
下面看一个例子,这个例子将贯穿本章。
XAML部分:
<Window >
<Grid>
<TextBlock >Name:</TextBlock>
<TextBox x:Name="nameTextBox" />
<TextBlock >Age:</TextBlock>
<TextBox x:Name="ageTextBox" />
<Button x:Name="birthdayButton" >Birthday</Button>
</Grid>
</Window>
<Grid>
<TextBlock >Name:</TextBlock>
<TextBox x:Name="nameTextBox" />
<TextBlock >Age:</TextBlock>
<TextBox x:Name="ageTextBox" />
<Button x:Name="birthdayButton" >Birthday</Button>
</Grid>
</Window>
后台代码部分:
public partial class Window1 : System.Windows.Window
{
Person person = new Person("Tom", 9);
public Window1()
{
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)
{
switch (e.PropertyName)
{
case "Name":
this.nameTextBox.Text = person.Name;
break;
case "Age":
this.ageTextBox.Text = person.Age.ToString();
break;
}
}
void nameTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
person.Name = nameTextBox.Text;
}
void ageTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
int age = 0;
if (int.TryParse(ageTextBox.Text, out age))
{
person.Age = age;
}
}
private void birthdayButton_Click(Object sender, RoutedEventArgs e)
{
++person.Age;
MessageBox.Show(
string.Format(
"Happy Birthday, {0}, age {1}!",
person.Name,
person.Age),
"Birthday");
}
}
{
Person person = new Person("Tom", 9);
public Window1()
{
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)
{
switch (e.PropertyName)
{
case "Name":
this.nameTextBox.Text = person.Name;
break;
case "Age":
this.ageTextBox.Text = person.Age.ToString();
break;
}
}
void nameTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
person.Name = nameTextBox.Text;
}
void ageTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
int age = 0;
if (int.TryParse(ageTextBox.Text, out age))
{
person.Age = age;
}
}
private void birthdayButton_Click(Object sender, RoutedEventArgs e)
{
++person.Age;
MessageBox.Show(
string.Format(
"Happy Birthday, {0}, age {1}!",
person.Name,
person.Age),
"Birthday");
}
}
辅助类:
public class Person : INotifyPropertyChanged
{
public Person() { }
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
string name;
public string Name
{
get { return this.name; }
set
{
this.name = value;
OnPropertyChanged("Name");
}
}
int age;
public int Age
{
get { return this.age; }
set
{
this.age = value;
OnPropertyChanged("Age");
}
}
INotifyPropertyChanged Members
protected void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
{
public Person() { }
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
string name;
public string Name
{
get { return this.name; }
set
{
this.name = value;
OnPropertyChanged("Name");
}
}
int age;
public int Age
{
get { return this.age; }
set
{
this.age = value;
OnPropertyChanged("Age");
}
}
INotifyPropertyChanged Members
protected void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
显示效果: