Welcome

首页 / 软件开发 / Silverlight / 稳扎稳打Silverlight(15) - 2.0数据之一次绑定,单向绑定,双向绑定……

稳扎稳打Silverlight(15) - 2.0数据之一次绑定,单向绑定,双向绑定……2010-04-26 cnblogs webabcd稳扎稳打Silverlight(15) - 2.0数据之一次绑定,单向绑定,双向绑定,INotifyPropertyChanged,数据转换,数据验证

介绍

Silverlight 2.0 数据绑定:

Binding - 将绑定目标对象的属性与数据源联接起来

Source - 绑定的数据源

Mode - 绑定的数据流的方向 [System.Windows.Data.BindingMode枚举]

BindingMode.OneTime - 一次绑定。创建绑定时一次性地更新绑定目标对象的属性

BindingMode.OneWay - 单向绑定(默认值)。数据源的改变会自动通知到绑定目标对象的属性

BindingMode.TwoWay - 双向绑定。数据源或绑定目标对象的属性的值发生改变时会互相通知。显然,做数据验证的话一定要是双向绑定

Path - 需要绑定的属性名称

NotifyOnValidationError - 产生验证错误时是否触发 BindingValidationError 事件。默认值为 false

ValidatesOnExceptions - 产生验证错误时绑定引擎是否要报告错误。默认值为 false

INotifyPropertyChanged - 向客户端发出某一属性值已更改的通知

IValueConverter - 值转换接口,将一个类型的值转换为另一个类型的值。它提供了一种将自定义逻辑应用于绑定的方式

Convert - 正向转换器。将值从数据源传给绑定目标时,数据绑定引擎会调用此方法

ConvertBack - 反向转换器。将值从绑定目标传给数据源时,数据绑定引擎会调用此方法

BindingValidationError - 出现验证错误或解决上次验证错误则触发此事件

在线DEMO

http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html

示例

1、NotifyProperty.xaml(演示INotifyPropertyChanged)

<UserControl x:Class="Silverlight20.Data.NotifyProperty"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel HorizontalAlignment="Left">

<!--
Binding - 将绑定目标对象的属性与数据源联接起来(本例为将 Ellipse的Fill属性 与 MyColor的Brush属性 相联)
Mode - Binding 的扩展属性之一,默认为 OneWay(单向绑定),即数据源的改变会自动通知到绑定目标对象的属性
-->
<Ellipse x:Name="ellipse" Width="100" Height="50" Fill="{Binding Brush, Mode=OneWay}" MouseLeftButtonDown="ellipse_MouseLeftButtonDown" />

</StackPanel>
</UserControl>

NotifyProperty.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.ComponentModel;

namespace Silverlight20.Data
{
public partial class NotifyProperty : UserControl
{
MyColor _myColor;

public NotifyProperty()
{
InitializeComponent();

this.Loaded += new RoutedEventHandler(NotifyProperty_Loaded);
}

void NotifyProperty_Loaded(object sender, RoutedEventArgs e)
{
_myColor = new MyColor { Brush = new SolidColorBrush(Colors.Red) };

// DataContext - FrameworkElement 做数据绑定时的数据上下文
// 将 MyColor 对象绑定到 Ellipse
ellipse.DataContext = _myColor;
}

private void ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// 鼠标按下后修改 MyColor 对象的属性
// 如果MyColor实现了INotifyPropertyChanged接口,并且绑定目标的BindingMode为OneWay或者TwoWay的话则会自动通知到绑定目标
if (_myColor.Brush.Color == Colors.Red)
_myColor.Brush = new SolidColorBrush(Colors.Green);
else
_myColor.Brush = new SolidColorBrush(Colors.Red);
}
}

/**//*
* INotifyPropertyChanged - 向客户端发出某一属性值已更改的通知
* 使用 OneWay 或者 TwoWay 的话必须要实现 INotifyPropertyChanged 接口
*/
public class MyColor : INotifyPropertyChanged
{
private SolidColorBrush _brush;
public SolidColorBrush Brush
{
get { return _brush; }
set
{
_brush = value;
if (PropertyChanged != null)
{
// 触发 PropertyChanged 事件,事件参数为属性名称
PropertyChanged(this, new PropertyChangedEventArgs("Brush"));
}
}
}

// 声明一个 PropertyChanged 事件
public event PropertyChangedEventHandler PropertyChanged;
}
}