- 浏览: 495665 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
Silverlight3系列(七)数据绑定 Data Binding 3 数据类型转换 Data Converter
- 博客分类:
- [发布至博客园首页]
Silverlight3系列(七)数据绑定 Data Binding 3 数据类型转换 Data Converter
7 数据转换
在普通的情况下,数据从后台到前台显示,没有任何变化。看起来是符合逻辑的,但是有可能不是你想要的效果,数据源的数据可能是的低级别的(这里的低级别是说数据比较原始,或者说是数据库可以理解的,不是最终用户可以理解的形式),你不想让他直接显示在界面上。例如:你可能会将数字变成用户可以看懂的形式、或者是想让日期显示成长格式的字符串。如果是这样的话,你需要将数据转换成正确的显示形式。如果是双向绑定,你也需要将用户提供的数据转换成数据库可以存储的形式。
很幸运的是,Silverlight允许你创建一个值转换类来完成。这个值转换类负责将数据库的值转换成可以显示的值,如果是双向绑定,还可以将用户输入的值转换成数据库可以存储的值。
在数据绑定中,值转换是很常用的。你可以在下列的情况中使用它们:
1)将数据格式化成string。例如:将数字转换成string,这是最常用的方式,但不是唯一的功能。
2)创建一个特殊的Silverlight类型。例如:你将读取的一些二进制数据创建成一个BitmapImage对象,以便可以将它绑定到一个Image控件。
3)有条件的改变一个绑定数据的一些属性。例如:通过值转换类改变一个控件的背景色,或者是高亮显示其中的一部分。
7.1 使用值转换格式换字符串
值转换对于需要从数字显示为字符串的时候,是一个很好的工具。例如:你的一个商品的单价属性,在数据库中你可能使用decimal存储,但是显示的时候你需要显示为3.9900,或者你还需要显示成一个钱的符号,就好像¥49.99。
你可以通过下面的步骤创建一个值转换类。
1)创建一个实现IValueConverter接口(接口在System.Windows.Data空间下面)的类,将这个类放在你的Silverlight项目中,而不是webservice项目中。
2)实现Convert()方法,将原始值转换为可以显示的值。
3)实现ConvertBack()方法,反过来,将显示的值,转换为原始的值。
上图是一个转换的示意图。
在decima数值l到currency货币的转换中,你可以使用Decimal.ToString()方法来完成,你需要设置转换结果的形式“C”
string currentyText=decimalPrice.ToString("C");
方法中的环境设置使用了当前的运行环境语言文件,如果简体中文是当前的语言环境的话,就会显示¥符号。如果你想换成另外一个语言显示形式,你就需要声明语言环境,例如你想显示美元形式,你需要这么做
CultureInfo culture=new CultureInfo("en-US");
string currentyText=decimalPrice.ToString("C",culture);
下面是几种常用的字符串格式形式。
Type |
FormatString |
Example |
Currency |
C |
$1,234.50 |
Scientific 科学计数法 |
E |
1234.50E+004 |
Percentage |
P |
45.6% |
Fixed Decimal |
F? |
小数点后的几位,F3会格式为123.400,F0会格式为123 |
Short Date |
d |
M/d/yyyy For example:10/30/2009 |
Long Date |
D |
dddd,MMMM dd,yyyy For example:Monday,January 30,2005 |
Long Date and Short Time |
f |
dddd,MMMM dd,yyyy HH:mm aa For example:Monday,January 30,2005 10:00 AM
|
Long Date and Long Time |
F |
ddd,MMMM dd,yyyy HH:mm:ss aa For example:Monday,January 30,2005 10:00:26 AM |
ISO Sortable Standard |
s |
yyyy-MM-dd HH:mm:ss For example:2005-01-30 10:02:18 |
Month and Day |
M |
MMMM dd For example:January 30 |
General |
G |
M/d/yyyy HH:mm:ss aa(依赖于本地设置) For example:10/30/2005 10:00:23 AM |
从显示格式转换成数值,可能需要一点小技巧。double类型的Parse()和TryParse()方法是一种选择,但是通常他们不能处理带有货币符号的字符串。解决的办法是,使用重载的Parse和TryParse方法,在方法中添加一个System.Globalization.NumberStyles值。如果你使用System.Globalization.NumberStyles.Any,你可以成功的去除货币符号,如果它存在。
下面是一个价格转换的例子。
代码
public class PriceConverter:IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double price = (double)value;
return price.ToString("C", culture);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string price = value.ToString();
double result;
if (double.TryParse(price, System.Globalization.NumberStyles.Any, culture, out result) == true)
{
return result;
}
return value;
}
#endregion
如果要使用这个转换,你需要在声明一个命名空间,下面假定你的值转换类处于Silverlight.ValueConverter命名空间下面。
xmlns:local="clr-namespace:Silverlight.ValueConverter"
你需要将上面的这个属性添加到顶级节点<UserControl>中,现在你需要在页面的资源集合中创建一个PriceConverter类,
<Usercontrol.Resources>
<local:PriceConverter x:Key="PriceConverter" ></local:PriceConverter>
</Usercontrol.Resources>
然后你可以绑定一个静态资源
<TextBox Margin="5" Grid.Row="0" Grid.Column="0"
Text="{Binding UnitCost, Mode=TwoWay, Converter={StaticResource PriceConverter}}"></TextBox>
7.2 使用值转换创建对象
值转换独立于数据的存储方式和数据的展示方式。例如:你有一个图片以二进制的形式存储在数据库中,你可以把它转换成System.Windows.Media.Imaging.BitmapImage对象。当然了,这么设计也许不是最合适的。
你可能需要很灵活的创建更多的类型,你的数据类库可能被Silverlight和Windows Form(需要转换成System.Drawing.Bitmap)都有调用。在这种情况下,你需要将原始的二进制转换成BitmapImage类型。
从二进制转换为一张图片,你首先要创建一个BitmapImage对象,同时将二进制读到MemoryStram中。然后,调用BitmapImage.SetSource()方法,将流中的数据传输给BitmapImage对象。
产品表中的可能没有存储二进制的图片信息,可能存储的是和产品有关的图片的路径。这种情况下,你就更有理由延缓创建图片对象。第一,图片可能没有访问权限,依赖于应用运行在哪里;第二,没有必要分配额外的内存资源,除非你要显示它。
ProductImage字段存储的是图片的文件名,不是图片的完整路径。这样给你一个灵活的配置,你可以从任何地方获取图片。值转换环类有任务将存储的文件名结合网站,返回图片的地址。网站的根URI使用一个自定义属性RootUri存储,默认是网站的Uri,下面是完整代码。
{
private string _rootUri;
public string RootUri
{
get { return this._rootUri; }
set { this._rootUri = value; }
}
public ImagePathConverter()
{
string uri = "http://baidu.com/";
_rootUri = uri.Remove(uri.LastIndexOf("/"),
uri.Length - uri.LastIndexOf('/'));
}
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string imagePath = RootUri + "/" + (string)value;
return new System.Windows.Media.Imaging.BitmapImage(new Uri(imagePath));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//图片是不能编辑的,这里就没有必要支持反向转换
throw new NotImplementedException();
}
#endregion
}
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namaspace:Silverlight.ValueConverter"
Width="400" Height="300">
<UserControl.Resources >
<local:ImagePathConverter x:Key="ImagePathConverter"></local:ImagePathConverter>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions >
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions >
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Image Margin="5" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left"
Source="{Binding ProductImagePath, Mode=TwoWay, Converter={StaticResource ImagePathConverter}}"></Image>
</Grid>
</UserControl>
你可以改进这里例子,首先,在创建一个不存在图片的BitmapImage的时候你可以抛异常,在你绑定数据的时候可以收到。或者你可以在ImagePathConverter类中加一个属性,来配置这个行为。添加一个bool类型的属性SuppressExceptions。如果设置为true,你可以捕获一个异常,然后再Convert方法中返回一个空字符串,或者添加一个默认的图片,如果有异常就显示这个默认的图片。
7.3 应用有条件的格式化
有一些很有意思的转换在表现层中设计不到。相反,你打算使用一些数据规则来控制显示效果。
例如:你想要根据值的大小变化背景颜色,你就可以声明下面这样一个类
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.Windows.Data;
namespace Silverlight.ValueConverter
{
public class PriceToBackgroundConverter:IValueConverter
{
public double MinimumPriceToHighlight
{ set; get; }
public Brush HighlightBrush
{ set; get; }
public Brush DefaultBrush { set; get; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double price = (double)value;
if (price >= MinimumPriceToHighlight)
return HighlightBrush;
else
return DefaultBrush;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:Silverlight.ValueConverter"
Width="400" Height="300">
<UserControl.Resources >
<loc:PriceToBackgroundConverter x:Key="PriceToBackgroundConverter"
DefaultBrush="{x:null}" HighlightBrush="Orange" MinimumPriceToHighlight="50"></loc:PriceToBackgroundConverter>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions >
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions >
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Border Background="{Binding UnitCost, Converter={StaticResource PriceToBackgroundConverter}}" ></Border>
</Grid>
</UserControl>
<Border Background="{Binding UnitCost, Converter={StaticResource PriceToBackgroundConverter}, ConverterParameter=50}" ></Border>
如果想上面这样传递了ConverterParameter参数的话,可以在Convert方法中使用
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double price = (double)value;
if (price >= double.Parse (parameter .ToString ()))
return HighlightBrush;
else
return DefaultBrush;
}
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 547如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 669组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 528本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5915 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 614前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 836企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 624首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 594概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 996概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 803我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8401 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9691、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 777引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 650oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 605经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 633今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 682我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 699今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 671题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
在Android开发中,数据绑定(Data Binding)是一个强大的框架,它允许开发者更加直观地将UI组件与业务数据关联起来,从而简化代码并提高可维护性。这个Demo程序旨在展示数据绑定和事件绑定的基本用法,帮助开发者...
**Silverlight绑定数据**是微软开发的一个关键技术,用于在用户界面和应用程序逻辑之间建立桥梁,使得数据能够自动更新UI元素,极大地简化了UI与后台数据的交互。本示例源码提供了一个直观的教学,展示了如何在...
1. **概念理解**:Data Binding允许开发者在XML布局文件中声明数据绑定表达式,将UI组件直接与数据模型关联,减少Java代码中的回调和事件处理。 2. **库引入**:在build.gradle模块文件中添加依赖: ``` ...
- **数据绑定表达式**: XAML中的{Binding}标记用于创建数据绑定表达式,可以指定要绑定的属性和数据源。 2. **Grid控件** - **Grid控件**是Silverlight中的布局容器,用于组织和定位子元素。它通过行和列定义来...
6. **Converter**: 转换器允许在数据源和UI之间转换数据类型。例如,一个日期时间值可能需要格式化为字符串在界面上显示。 7. **NotifyPropertyChanged**: 对于自定义数据类,实现INotifyPropertyChanged接口是必要...
6. **数据模板**:在显示复杂数据类型时,数据模板允许自定义数据的呈现方式。在示例中,可能使用DataTemplate来格式化和展示数据库记录,以提高用户体验。 7. **数据验证**:VB.NET的数据绑定还支持内置的数据验证...
在本文中,我们将深入探讨Silverlight中的数据绑定,特别是如何绑定到集合数据。数据绑定是Silverlight应用程序中连接用户界面(UI)与数据模型的重要机制,使得UI元素能够动态反映数据的变化。 首先,数据绑定可以...
Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET By Brian Noyes ............................................... Publisher: Addison Wesley ...
Data Binding库是Android官方提供的一个框架,它的核心思想是双向数据绑定,允许开发者直接在布局XML文件中引用和操作Java对象的属性,减少了手动设置视图内容的步骤。通过使用表达式语言,可以在XML中进行简单的...
以下是Android Architecture Components的优势: ...Android Architecture Components中的Data Binding库可以帮助开发者将数据绑定到UI控件上,以减少手动设置UI控件的代码量,提高开发效率。 5. 易于学习和使用
3. **数据上下文(DataContext)**:设置控件的数据上下文可以将整个视图模型暴露为默认的绑定源,这样所有子控件都将此DataContext作为它们的默认源。 4. **双向绑定**:默认情况下,数据绑定是单向的,但可以通过...
Android Data Binding是Google推出的一种强大的数据绑定库,它旨在简化Android应用中的UI逻辑,通过将数据绑定到XML布局文件中,使代码更加清晰、可读性更强,同时也减少了Activity或Fragment中的样板代码。...
Flex Data Binding是Adobe Flex框架中的核心特性之一,它允许开发者创建数据驱动的应用程序,通过将UI组件的属性与数据模型的属性直接关联,实现实时的数据同步。在Flex中,数据绑定确保当数据源发生变化时,相关的...
在.NET Framework中,数据绑定主要涉及到`BindingContext`、`CurrencyManager`、`PropertyManager`和`Binding`类。 1. `BindingContext`对象: `BindingContext`是每个Windows窗体的基础属性,它维护了一个`...
4. **转换器(Converter)**: 可选组件,用于在源数据和目标之间进行类型转换。 ### 数据绑定的模式 1. **单向绑定(One-Way Binding)**: 数据只从源到目标更新,适用于只需要显示数据但不需用户修改的情况。 2....
最后,数据转换器(`IValueConverter`)在WPF中用于在数据绑定过程中转换数据类型。例如,如果需要将数字转换为颜色,可以创建一个转换器: ```csharp public class NumberToColorConverter : IValueConverter { ...
《Data Binding with Windows Forms 2.0:编程智能客户端数据应用程序与.NET》是一本深入探讨.NET框架下Windows Forms 2.0数据绑定技术的专业书籍。数据绑定是将用户界面(UI)组件与数据源连接的过程,它使得应用...