SilverLight中的通知机制是指当绑定源的属性的值发送变化的时候通知绑定目标控件,让目标控件同时也发生变化
INotifyPropertyChanged这个接口提供这样的工作机制,向客户端发出某一属性值已更改的通知。
定义如下:主要是一个委托事件PropertyChanged
// 摘要:
// 向客户端发出某一属性值已更改的通知。
public interface INotifyPropertyChanged
{
// 摘要:
// 在更改属性值时发生。
event PropertyChangedEventHandler PropertyChanged;
}
下面的例子定义了Clock类,实现了INotifyPropertyChanged接口,Clock绑定给Textblock控件,把Second属性绑定到Textblock控件的Text属性中
当Second发生变化的时候,通知Textblock控件也改变Text的值
//继承INotifyPropertyChanged接口
public class Clock : INotifyPropertyChanged
{
//接口中定义的
public event PropertyChangedEventHandler PropertyChanged;
int second;
public Clock()
{
OnTimerTick(null, null);
//DispatcherTimer线程机制,每秒中调用一次OnTimerTick方法
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += OnTimerTick;
timer.Start();
}
//Second属性
public int Second
{
get {
return second;
}
set
{
if (value != second)
{
second = value;
//如果属性发生变化,调用OnPropertyChanged这个方法,这个方法去通知事件
OnPropertyChanged(new PropertyChangedEventArgs("Second"));
}
}
}
//这个方法使Second属性得到当前时间的秒数
public void OnTimerTick(object sender,EventArgs e)
{
DateTime dt = DateTime.Now;
Second = dt.Second;
}
public virtual void OnPropertyChanged(PropertyChangedEventArgs args)
{
if (PropertyChanged != null)
{
//**********************
//触发事件
//??.但是没有看到处理事件的方法和函数??,silverlight应该是内部做了某些处理
PropertyChanged(this, args);
}
}
}
在页面中添加对这个Clock类的引用
xmlns:localCode="clr-namespace:PhoneApp1.Code;assembly=PhoneApp1"
定义资源可以方便复用Clock类
<phone:PhoneApplicationPage.Resources>
<localCode:Clock x:Key="clock"></localCode:Clock>
</phone:PhoneApplicationPage.Resources>
Textblock两种不同的实现方式
<TextBlock x:Name="tb1" Text="{Binding Source={StaticResource clock},Path=Second}"> </TextBlock>
//另外一个方式
<TextBlock x:Name="tb2">
<TextBlock.Text>
<Binding Path="Second">
<Binding.Source>
<localCode:Clock></localCode:Clock>
</Binding.Source>
</Binding>
</TextBlock.Text>
</TextBlock>
就这样,运行以后,就可以看到Textblock控件的Text属性值每秒都会变化,显示当前实时的秒数。
在Clock类中,可以看到通知事件的机制,但是没有看到事件执行的方法和函数,很奇怪,应该是sliverlight已经封装。
如果从CS代码中绑定Textblock和Clock控件,
下面的处理方式更符合传统的处理机制
页面只需要定义<TextBlock x:Name="tb1"/>
Clock clock = new Clock();
//事件 委托方法
clock.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(clock_PropertyChanged);
//事件处理方法
void clock_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "Second")
{
Clock temp = sender as Clock;
tb1.Text = temp.Second.ToString();
}
}