Binding上

1. 绑定概述

  • 数据绑定(data binding)是将控件和element链接到数据的技术。它常常可以取代事件处理函数,大大简化代码。
  • 数据绑定具有源(source)和目标(target),一般来说,源是某种数据,目标则是一个控件。(有时候角色会对调)
  • “绑定”一定是在target上做设定
  • 绑定的目标必须继承自DependcyObject,绑定所设定的property必须有dependency property的支持

2. 简单实例

复制代码
   
   
< StackPanel xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" > <!-- Binding Source. --> < ScrollBar Name ="scroll" Orientation ="Horizontal" Margin ="24" Maximum ="100" LargeChange ="10" SmallChange ="1" /> <!-- Binding Target. --> < Label HorizontalAlignment ="Center" Content ="{Binding ElementName=scroll, Path=Value}" /> </ StackPanel >
复制代码

 代码说明:

  1. label的content将会实时显示Scrollbar的Value值的变化
  2. 要注意语法,如果不习惯用大括号,还可以这么写
        
        
    < Label.Content > < Binding ElementName ="scroll" Path ="Value" />
    </ Label.Content >
  3. c#代码设定:

        
        
    Binding bind = new Binding(); bind.Source = scroll; bind.Path = new PropertyPath(ScrollBar.ValueProperty); lbl.SetBinding(Label.Content, bind);
    其中SetBinding方法第一个参数必须为Denpendcy Property

3. 绑定的4种模式

  1. Mode=“OneWay”
    源到目标的绑定
  2. Mode=“TwoWay”
    双向的绑定
  3. Mode=“OneTime”
    一次绑定,它从目标源取的数据,进行初始化,但不会持续跟踪变化
  4. Mode=“OneWayToSource”
    目标到源的绑定,即“源根据目标来更新”。当目标的property没有denpendcy property支持,而源的property有denpendcy property支持时,可以将绑定放在源上,然后设置为该绑定模式。

   注:默认的绑定模式是不确定的,所以最好显示地指定绑定模式

4. 通过DataContext属性绑定

 DataContext可以沿着element tree中被继承,所以如果你为一个element设定DataContext,则该element所有的孩子都会受到影响,例如:

复制代码
   
   
< StackPanel xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" DataContext ="{Binding ElementName=scroll}" > <!-- Binding Source. --> < ScrollBar Name ="scroll" Orientation ="Horizontal" Margin ="24" Minimum ="1" Maximum ="100" LargeChange ="10" SmallChange ="1" /> <!-- Binding Targets. --> < Label HorizontalAlignment ="Center" Content ="{Binding Path=Value, Mode=OneWay}" /> < Button HorizontalAlignment ="Center" Margin ="24" FontSize ="{Binding Path=Value, Mode=OneWay}" > Bound Button </ Button > </ StackPanel >
复制代码

如果在一个面板内,许多控件都绑定到一个特定对象的不同property上,只要将DataContext设定到该类型的不同对象上,所以的控件都会反应此新对象的内容。

5. Converter 

当数据传递时,可能需要转换数据,Binding类包括了一个Coverter的property,该属性的对象类型必须实现接口:IvalueConverter

格式如下:

复制代码
   
   
public class MyConverter : IValueConverter { /// <summary> /// 源到目标的转换 /// </summary> /// <param name="value"> 绑定源生成的值 </param> /// <param name="typeTarget"> 绑定目标属性的类型,也就是该方法的返回类型 </param> /// <param name="param"> 要使用的转换器参数(附加参数,可以是任何数据类型或者对象引用) </param> /// <param name="culture"> 要用在转换器中的区域性(一般可以忽略) </param> public object Convert( object value, Type typeTarget, object param, CultureInfo culture) { // ... } /// <summary> /// 目标到源的转换 /// </summary> /// <param name="value"> 绑定目标生成的值 </param> /// <param name="typeTarget"> 要转换到的类型,也就是该方法的返回类型 </param> /// <param name="param"> 要使用的转换器参数 </param> /// <param name="culture"> 要用在转换器中的区域性 </param> public object ConvertBack( object value, Type typeTarget, object param, CultureInfo culture) { // ... } }
复制代码

在c#中使用以上定义的Converter:

  
  
Binding bind = new Binding(); bind.Converter = new MyConverter();

在XAML中使用以上定义的Converter,需要先将其加到Resource中,在Resources section中:

  
  
< src:MyConverter x:Key ="conv" />

然后使用:

  
  
"{Binding ... Convert={StaticResource conv}, ... }"

6. 一个使用Converter的数据绑定完整实例

 在c#代码中定义Converter,将数据在double和decimal中转换

复制代码
   
   
using System; using System.Globalization; using System.Windows; using System.Windows.Data; namespace Petzold.DecimalScrollBar { [ValueConversion( typeof(double), typeof(decimal))] public class DoubleToDecimalConverter : IValueConverter { public object Convert( object value, Type typeTarget, object param, CultureInfo culture) { decimal num = new Decimal(( double )value); if (param != null ) num = Decimal.Round(num, Int32.Parse(param as string )); return num; } public object ConvertBack( object value, Type typeTarget, object param, CultureInfo culture) { return Decimal.ToDouble(( decimal )value); } } }
复制代码

 代码说明:

  1. MSDN建议在定义Converter之前使用 ValueConversion( ValueConversionAttribute类) attribute,指定转换器的实现中涉及的数据类型。
  2. 注意上面用到了附加参数param,用来控制小数点位数。

在XAML文件中使用数据绑定:

复制代码
   
   
< Window xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:src ="clr-namespace:Petzold.DecimalScrollBar" Title ="Decimal ScrollBar" > < Window.Resources > < src:DoubleToDecimalConverter x:Key="conv" /> </ Window.Resources > < StackPanel > <!-- Binding Source. --> < ScrollBar Name ="scroll" Orientation ="Horizontal" Margin ="24" Maximum ="100" LargeChange ="10" SmallChange ="1" /> <!-- Binding Target. --> < Label HorizontalAlignment ="Center" Content ="{Binding ElementName=scroll, Path=Value, Converter={StaticResource conv}, ConverterParameter=2}" /> </ StackPanel > </ Window >
复制代码

代码说明:

  1. 注意引用命名空间
  2. 通过设置ConverterParameter property,指定保留两位小数。
  3. 当移动滚动条时,label会显示两位小数的Value值

 7. 多重绑定(multi-binding)

  • 多重绑定将来自多个源的多个对象,合并为一个单一的目标。
  • 多重绑定的转换器必须实现IMultiValueConverter接口

实现IMultiValueConverter接口的例子

复制代码
   
   
public class RgbToColorConverter : IMultiValueConverter { public object Convert( object [] value, Type typeTarget, object param, CultureInfo culture) { Color clr = Color.FromRgb(( byte )( double )value[ 0 ], ( byte )( double )value[ 1 ], ( byte )( double )value[ 2 ]); if (typeTarget == typeof (Color)) return clr; if (typeTarget == typeof (Brush)) return new SolidColorBrush(clr); return null ; } public object [] ConvertBack( object value, Type[] typeTarget, object param, CultureInfo culture) { Color clr; object [] primaries = new object [ 3 ]; if (value is Color) clr = (Color)value; else if (value is SolidColorBrush) clr = (value as SolidColorBrush).Color; else return null ; primaries[ 0 ] = clr.R; primaries[ 1 ] = clr.G; primaries[ 2 ] = clr.B; return primaries; } }
复制代码

  代码说明:

  1. 该转换器将三个double值转换成color或者Brush
  2. 注意Convert的第一个参数是对象数组

使用该转换器:

复制代码
   
   
< Border.Background > < MultiBinding Converter ="{StaticResource convRgbToColor}" > < Binding ElementName ="scrRed" Path ="Value" Mode ="OneWay " /> < Binding ElementName ="scrGreen" Path ="Value" Mode ="OneWay " /> < Binding ElementName ="scrBlue" Path ="Value" Mode ="OneWay " /> </ MultiBinding > </ Border.Background >
复制代码

 代码说明:

  1. 该Binding从三个ScrollBar(scrRed,scrGreen,scrBlue)中获取value值,然后传递到转换器的对象数组
  2. 转换器根据这个三个值返回一个Brush,设置为Border的Background属性值
  3. 对于MultiBinding的Binding element,也可以使用各自的转换器

8. UpdateSourceTrigger属性

  •  Binding的UpdateSourceTrigger属性用来设定更新绑定源的时间(在TwoWay或OneWayTOSource模式下使用)
  • UpdateSourceTrigger的值为枚举类型
    1. LostFocus:当控件失去焦点时更新源(在数据源是数据库的情况下,可以避免频繁操作数据库)
    2. PropertyChanged: 当绑定的目标属性的值发生改变时更新源,这样可以实时反应目标属性的变化
    3. Explicit:仅在调用 UpdateSource 方法时更新绑定源
      如果选用此选项,需要先在“定义此binding的element(注:按我的理解就是目标控件了)”上调用GetBindingExpression方法
  
  
// itemNameTextBox is an instance of a TextBox BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);

              然后在点击“更新”或“确定”按钮时,调用UpdateSource方法:

  
  
be.UpdateSource();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值