WPF QuickStart系列之数据绑定(Data Binding)
这篇博客将展示WPF DataBinding的内容。
首先看一下WPF Data Binding的概览,

Binding Source可以是任意的CLR对象,或者XML文件等,Binding Target需要有依赖属性。这样便可以进行Data Binding。请看下面的示例,
C#
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); DataContext = new Person() { Name = "Tom", Age = 25 };
}
} public class Person
{
public string Name { get; set; } public int Age { get; set; }
}
XAML:
<Grid>
<StackPanel>
<TextBlock Text="{Binding Name}" Margin="10,5"/>
<TextBlock Text="{Binding Age}" Margin="10,5"/>
</StackPanel>
</Grid>
运行结果: 
下面通过一些例子来介绍在Data Binding,
1. 我们可以在XAML中,指定Binding Target的ElementName和Path属性来获取Binding Source的数据,例如,
XAML:
<StackPanel>
<Slider x:Name="_slider" Minimum="0" Maximum="100" Value="20"/>
<TextBox Text="{Binding ElementName=_slider,Path=Value}"/>
</StackPanel>
运行结果: 
上面XAML代码中,将Slider的Value属性Binding到TextBox。
通过上面的Gif图片可以发现,当拖动Slider时,TextBox框中的数值随着Slider的Value改变而改变,当在TextBox中输入数值时,按Tab键失去焦点后,Slider的Value发生了改变。这是因为TextBox的默认Binding Mode为TwoWay,且UpdateSoureTrigger默认为LostFocus。请看下面的BindingMode示意图,

图示中有种Binding Mode,
OneWay,数据流向是从Source到Target;
TwoWay,数据可以从Source到Target,也可以从Target到Source,
OneWayToSource与OneWay相反,
OneTime,表示数据绑定发生后,数据源无论如何改变,Target中绑定的值都不会发生改变。
下面我们通过例子来演示这4种绑定
XAML:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions> <!--OneWay Binding-->
<StackPanel>
<TextBlock Text="Binding Mode: OneWay"/>
<Slider x:Name="_slider" Minimum="0" Maximum="100" Value="20"/>
<TextBox Text="{Binding ElementName=_slider,Path=Value,Mode=OneWay}"/>
</StackPanel> <!--OneTime Binding-->
<StackPanel Grid.Row="1" Margin="0,20">
<TextBlock Text="Binding Mode: OneTime"/>
<Slider x:Name="_slider1" Minimum="0" Maximum="100" Value="20"/>
<TextBox Text="{Binding ElementName=_slider1,Path=Value,Mode=OneTime}"/>
</StackPanel> <!--OneWayToSource Binding-->
<!--将TextBox的FontSize默认值为12-->
<StackPanel Grid.Row="2">
<TextBlock Text="Binding Mode: OneWayToSource"/>
<Slider x:Name="_slider2" Minimum="0" Maximum="100" Value="20"/>
<TextBox FontSize="{Binding ElementName=_slider2,Path=Value, Mode=OneWayToSource}"
Text="{Binding RelativeSource={RelativeSource Self},Path=FontSize}"/>
</StackPanel> <!--TwoWay Binding-->
<StackPanel Grid.Row="3" Margin="0,20">
<TextBlock Text="Binding Mode: TwoWay"/>
<Slider x:Name="_slider3" Minimum="0" Maximum="100" Value="20"/>
<TextBox Text="{Binding ElementName=_slider3,Path=Value,Mode=TwoWay}"/>
</StackPanel>
</Grid>
运行结果: 
在项目开发中根据实际需要选择不同的Binding Mode,如果某些数据只在程序启动时显示,后面对数据进行修改了,不需要更新,可以选择OneTime Mode;如果对数据进行实时展示,可以选择OneWay Mode;如果需要将数据的修改同步,那么我们选择TwoWay Mode。合适的绑定模式可以最优化程序的性能。
接下来看UpdateSourceTrigger,UpdateSourceTrigger有下面几种取值,
1. LostFocus, 例如TextBox失去焦点后更新Source;
2. PropertyChanged,例如当在TextBox中输入时,Source便同步更新;
3. Explict,需要显示的调用UpdateSource方法;
下面我们看Binding中另一个概念Converter;看这样一个例子,有一个文本框显示当前温度,如果温度大于35,则将文本框的前景色设置为红色,如果温度小于0,则显示为蓝色;
XAML:
<Window.Resources>
<local:TemperatureToBrushCoverter Hot="35" Cold="0" x:Key="TemperatureToBrushCoverter"/>
</Window.Resources>
<Grid>
<TextBox Text="30" Width="200" Height="25"
Foreground="{Binding Path=Text,RelativeSource={RelativeSource Self},
Converter={StaticResource TemperatureToBrushCoverter}}"/>
</Grid>
C#:
[ValueConversion(typeof(double),typeof(Brush))]
public class TemperatureToBrushCoverter : IValueConverter
{
public double Hot { get; set; } public double Cold { get; set; } public TemperatureToBrushCoverter()
{ } public TemperatureToBrushCoverter(double hot,double cold)
:this()
{
Hot = hot;
Cold = cold;
} public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double temp; Brush brush = Brushes.Black; if(Double.TryParse((string)value,out temp))
{
if(temp > Hot)
{
brush = Brushes.Red;
}
else if(temp < Cold)
{
brush = Brushes.Blue;
}
} return brush;
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
运行结果:

注意要在XAML中引用Converter。
最后我们看一下DataBinding中的数据验证;来看这样一个例子,将Person对象的Age绑定到一个TextBox上,并可以对Age进行修改,年龄是一个有实际意义的值,如果Age小于0或者大于120,我们均认为其为非法值,给出相应提示。请看下面的代码:
XAML:
<Grid>
<TextBox Width="200" Height="25">
<TextBox.Text>
<Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:AgeValidationRule ValidationStep="RawProposedValue"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<!--Error Template-->
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<AdornedElementPlaceholder/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
</Grid>
C#:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); DataContext = new Person() { Age = 25};
}
} public class Person
{
public int Age { get; set; } } public class AgeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int age; if(int.TryParse((string)value,out age))
{
if(age< 0 || age > 120)
{
return new ValidationResult(false, "This is invalide age.");
}
else
{
return new ValidationResult(true, null);
}
} return new ValidationResult(false, "Please input valid age.");
}
}
运行结果:

这篇博客的内容就到这里了,但是WPF中Data Binding的内容远不止这些,会在后面的博客中展现。
感谢您的阅读!代码点击这里下载。
WPF QuickStart系列之数据绑定(Data Binding)的更多相关文章
- WPF QuickStart系列
接触WPF有一段时间了,现在做的项目也是WPF相关的.所以决定写一个WPF QuickStart系列的文章.也是自己对WPF学习的总结,如果对你有帮助,就非常棒了.因为不善言辞,所以尽量以WPF示例和 ...
- [WPF系列]-DataBinding(数据绑定) 自定义Binding
自定义Binding A base class for custom WPF binding markup extensions BindingDecoratorBase Code: public c ...
- WPF中的数据绑定Data Binding使用小结
完整的数据绑定的语法说明可以在这里查看: http://www.nbdtech.com/Free/WpfBinding.pdf MSDN资料: Data Binding: Part 1 http:// ...
- WPF之数据绑定Data Binding
一般情况下,应用程序会有三层结构:数据存储层,数据处理层(业务逻辑层),数据展示层(UI界面). WPF是“数据驱动UI”. Binding实现(通过纯C#代码) Binding分为source和ta ...
- WPF教程三:学习Data Binding把思想由事件驱动转变为数据驱动
之前大家写代码都喜欢用事件驱动,比如说鼠标输入的click事件.初始化的内容全部放在窗体加载完毕的load事件,等等,里面包含了大量的由事件触发后的业务处理代码.导致了UI和业务逻辑高度耦合在一个地方 ...
- WPF学习09:数据绑定之 Binding to List Data
从WPF学习03:Element Binding我们可以实现控件属性与控件属性的绑定. 从WPF学习07:MVVM 预备知识之数据绑定 我们可以实现控件属性与自定义对象属性的绑定. 而以上两个功能在实 ...
- WPF QuickStart系列之样式和模板(Style and Template)
在WPF桌面程序中,当我们想构建一个统一的UI表现时(在不同操作系统下,显示效果一致),此时我们就需要使用到WPF中的样式和模板技术.简单来说,如果我们需要简单的给一个Button设置宽,高,Marg ...
- Windows phone 8.1之数据绑定(Data Binding)
学习Winphone8.1的时候经常需要对Slider进行数据绑定后使之视觉化,方便调节Slider的值. 数据绑定分为源(Source)和目标(Target),Source一般分为两种,其他控件的数 ...
- WPF QuickStart系列之附加属性(Attached Property)
这一篇博客是关于如何使用附加属性和创建自定义附加属性的. 1. 附加属性使用, WPF中对附加属性使用最多的莫过于对控件布局时设置控件的位置,例如在Canvas中有一个Rectangle, Ellip ...
随机推荐
- 烂泥:php5.6源码安装及php-fpm配置
LNMP环境的搭建中,现在只有php没有源码安装过.这篇文章就把这个介绍下. 注意本篇文章使用的centos 6.5 64bit. 登陆centos下载php5.6的安装包.php的软件包可以去国内的 ...
- CentOS 7 运行级别切换
CentOS 7 之前的版本是通过 /etc/inittab 文件来定义系统运行级别: [sywu@wusuyuan ~]$ cat /etc/centos-release CentOS releas ...
- 【GoLang】与或非 异或操作
在Go规范,^这个运算符在一元运算符和二元运算符中都出现了.那么他们分别是啥?在规范中说道:^ bitwise XOR integers这是按位异或. Go语言位操作实例 <!-- lang: ...
- C#系统委托之Action And Func
Action Action<T> Func Func<T> Action:封装一个方法,该方法不具有参数并且不返回值 public delegate void Action() ...
- UESTC 250
windy数 基本的数位DP,需要判断当前位是否为起始位. #include <cstdio> #include <cmath> #include <cstring> ...
- iOS 在类别里添加成员变量的方法:objc_setAssociatedObject
今天在github上查看MJPopupViewController这个项目,发现里面用到了objc_setAssociatedObject,用来为类别添加成员变量. 我百度之后,发现有人是这样说明的: ...
- 警告: 程序集绑定日志记录被关闭(IIS7 64位系统)
部署一个.NET程序在IIS7服务器,出现如下信息: 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: S ...
- Centos6.5 Openvpn的安装与配置
一.安装准备 ? 1 2 yum -y install openssl-devel openssl yum -y install gcc gcc-c++ 二.OpenVPN服务端安装过程1.lzo下载 ...
- Effective C++ -----条款48:认识template元编程
Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率. TMP可被用来生成“基于政策选择组合”(based on ...
- HDU 3957 Street Fighter(搜索、DLX、重复覆盖+精确覆盖)
很久以前就看到的一个经典题,一直没做,今天拿来练手.街霸 给n<=25个角色,每个角色有 1 or 2 个版本(可以理解为普通版以及爆发版),每个角色版本可以KO掉若干人. 问最少选多少个角色( ...