注:本文由BeyondVincent(破船)原创首发
转载请注明出处:BeyondVincent(破船)@DevDiv.com
更多内容请查看下面的帖子
[DevDiv原创]Windows 8 开发Step by Step
小引
当绑定源的某个属性改变了,有时候在绑定目标上需要得到实时更新,比如航班起飞时间延误了,那么需要实时的将此信息告知乘客。本文,我就来介绍一下通知属性改变。
简介
属性改变的通知在程序开发过程中非常的实用,用上了该功能,我们就不用自己去改变UI界面更新等操作了。通过绑定引擎可以完成属性改变通知,不过开发者也需要在代码上做一些编写。
通知属性改变的关键技术
实现INotifyPropertyChanged接口
发起PropertyChanged事件
实现步骤
A、新建空白工程,名称为BV_Binding_INotifyPropertyChanged
B、在项目工程上单击右键,选择添加->选择类->输入People,然后确定
C、在People.cs文件实现INotifyPropertyChanged接口
代码如下:
注:此demo的作用是对年龄属性进行增加,在小于18时,为未成年,否则为成年
在引发PropertyChanged事件时,使用属性名作为参数。如果要想表示所有属性都改变了,那么可以用string.Empty当作参数。在下面的代码中,有具体的演示
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BV_Binding_INotifyPropertyChanged
{
public class People : INotifyPropertyChanged
{
private int age = 0;
private string typeLevel = "未成年";
public string TypeLevel
{
get { return typeLevel; }
set
{
typeLevel = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public int Age
{
get { return age; }
set
{
age = value;
if (age < 18)
{
TypeLevel = "未成年";
}
else
{
TypeLevel = "成年";
NotifyPropertyChanged(string.Empty);
return;
}
NotifyPropertyChanged("Age");
}
}
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
}
D、在MainPage.xaml中使用绑定
<Page
x:Class="BV_Binding_INotifyPropertyChanged.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:BV_Binding_INotifyPropertyChanged"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="Green" Name="grid">
<TextBlock Foreground="White" FontSize="50" Text="{Binding Age}" Margin="462,193,556,485"></TextBlock>
<TextBlock Foreground="White" FontSize="50" Text="{Binding TypeLevel}" Margin="462,288,556,407"></TextBlock>
<Button Content="+1" FontSize="50" HorizontalAlignment="Left" Height="84" Margin="497,397,0,0" VerticalAlignment="Top" Width="247" Click="Button_Click_1"/>
</Grid>
</Page>
E、MainPage.xaml.cs中设置DataContent,并处理按钮事件
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍
namespace BV_Binding_INotifyPropertyChanged
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class MainPage : Page
{
People people = new People();
public MainPage()
{
this.InitializeComponent();
grid.DataContext = people;
}
/// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。Parameter
/// 属性通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
++people.Age;
}
}
}
F、运行效果