Silverlight 中的单向、双向和一次性绑定






4.56/5 (12投票s)
本文将介绍将对象属性与 Silverlight 用户界面绑定的三种方法。
更新:Silverlight 常见问题解答 - 第三部分链接和视频已添加到本文
Silverlight 中的单向、双向和一次性绑定
视频演示:使用 Silver light 的单向、双向和单次绑定 |
引言
本文将介绍将对象属性与 Silverlight 用户界面绑定的三种方法。我们将首先介绍这三种绑定的基本原理,然后通过一个小示例来演示绑定是如何工作的。我们还附上了相应的源代码。
单向绑定
顾名思义,行为也如此。在单向绑定中,数据仅从对象流向 UI,反之则不然。例如,您可以有一个名为 TxtYear
的 textbox
,它绑定到一个具有 Year
属性的对象。因此,当对象值更改时,它将在 Silverlight UI 上得到反映,但 UI 无法更新对象中的 year 属性。
实现单向绑定是一个三步过程。首先,创建您想要与 Silverlight UI 绑定的类。例如,下面是一个简单的名为 ClsDate
的类,它有一个 Year
属性。
public class clsDate
{
private int _intYear;
public int Year
{
set
{
_intYear = value;
}
get
{
return _intYear;
}
}
}
在第二步中,您需要将 Year
属性与 Silverlight UI textbox
关联起来。要绑定属性,您需要在 textbox
UI 对象的 text
属性中指定 ‘Binding Path=Year
’。Year
是我们正在与 textbox
UI 对象绑定的属性。
<TextBox x:Name="txtCurrentYear" Text="{Binding Path=Year}"
Height="30" Width="150" VerticalAlignment="Center"
HorizontalAlignment="Center"></TextBox>
最后一步是将 textbox
的数据上下文与刚刚创建的日期对象进行绑定。
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
clsDate objDate = new clsDate();
objDate.Year = DateTime.Now.Year;
txtCurrentYear.DataContext = objDate;
}
}
双向绑定
双向绑定可确保 UI 和对象之间的数据同步。因此,对象中的任何更改都会反映到 UI,UI 中的任何更改都会反映到对象中。
要实现双向绑定,除了为 OneWay
提供的步骤之外,还需要另外两个步骤。第一个更改是我们必须将模式指定为 TwoWay
,如下面的 XAML 代码片段所示。
<TextBox x:Name="txtEnterAge" Text="{Binding Path=Age, Mode=TwoWay}"
Height="30" Width="150" VerticalAlignment="Center"
HorizontalAlignment="Center"></TextBox>
第二个更改是我们必须实现 INotifyPropertyChanged
接口。下面是一个展示如何实现 INotifyPropertyChanged
接口的类。请注意,您需要导入 System.ComponentModel
命名空间。
public class clsDate : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _intYear;
public int Year
{
set
{
_intYear = value;
OnPropertyChanged("Year");
}
get
{
return _intYear;
}
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this,new PropertyChangedEventArgs(property));
}
}
}
将数据与数据上下文绑定是必须执行的步骤。
一次性绑定
在一次性绑定中,数据仅从对象流向 UI 一次。没有机制来跟踪任一侧的数据更新。与前面讨论的两种绑定相比,一次性绑定在性能上有了显著的改进。这种绑定对于仅加载一次数据并进行查看的报表来说是一个不错的选择。
<TextBox x:Name="txtEnterAge" Text="{Binding Path=Age, Mode=OneTime}"
Height="30" Width="150"
VerticalAlignment="Center" HorizontalAlignment="Center"></TextBox>
单向和双向绑定的简单演示
下面是一个简单的示例代码,其中有两个文本框;一个用于输入年龄,另一个文本框用于计算近似出生日期。
下面是一个包含这两个属性的简单类。我们实现了 INotifyPropertyChanged
接口,以便我们可以为 year
属性实现双向通信。
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
//
using System.ComponentModel;
namespace SilverLightBinding
{
public class clsDate : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _intYear;
private int _intAge;
public int Year
{
set
{
_intYear = value;
OnPropertyChanged("Year");
}
get
{
return _intYear;
}
}
public int Age
{
set
{
_intAge = value;
Year = DateTime.Now.Year - _intAge;
}
get
{
return _intAge;
}
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(property));
}
}
}
}
最后,我们还将 Silverlight UI 对象与类属性进行了绑定。下面是相应的 XAML 代码片段。需要注意的一点是,Age
是使用双向模式绑定的,因为我们需要从用户界面修改它。
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">
Enter your age in the below text box</TextBlock>
<TextBox x:Name="txtEnterAge" Text="{Binding Path=Age, Mode=TwoWay}"
Height="30" Width="150" VerticalAlignment="Center"
HorizontalAlignment="Center"></TextBox>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">
Your approximate birth date</TextBlock>
<TextBox x:Name="txtCurrentYear" Text="{Binding Path=Year}"
Height="30" Width="150" VerticalAlignment="Center"
HorizontalAlignment="Center"></TextBox>
您可以从本文顶部的链接获取源代码。
其他 Silverlight FAQ
如果您是 Silverlight 的完全新手,那么以下是一些 Silverlight FAQ,可以帮助您快速入门。
Silverlight FAQ 第一部分:本教程包含 21 个基础 FAQ,可帮助您理解 WPF、XAML,构建您的第一个 Silverlight 应用程序,并解释 Silverlight 的整体架构。
Silverlight FAQ 第二部分(动画和转换):本教程包含 10 个 FAQ 问题,从 Silverlight 动画基础开始,然后展示一个简单的动画矩形。之后,文章将介绍 4 种不同的对象转换方法。
Silverlight FAQ 第三部分:本文讨论了 12 个 FAQ,围绕绑定、布局、使用 WCF 服务以及如何通过 Silverlight 连接到数据库。
如需进一步阅读,请观看下面的面试准备视频和分步视频系列。