1. WPF绑定使用的目标属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了Xaml扩展标记,WPF绑定一个控件是使用Binding.ElementName,绑定非控件对象时使用Source,RelativeSource,DataContext属性(WPF特有,而非XAML),只能绑定对象的共有字段.
    下边是部分Binding 属性名,完整列表参考 :http://msdn.microsoft.com/zh-cn/library/vstudio/ms750413.aspx
  • Source:数据提供者
  • RelativeSource:根据当前对象为基础,自动查找源并绑定
  • DataContext:如果未使用Source和RelativeSource,WPF就从当前控件开始在控件树种向上查找,并使用第一个非空的DataContext属性,可以在更高层次容器对象上设置DataContext,如下代码 Text 绑定到 Source属性,但未设置Text的绑定对象,会向上查找DataContext绑定的对象的Source属性
  • 示例代码:
<StackPanel DataContext="{X:Static SystemFonts.IconFontFamily}"> 
       <TextBox Margin="5" Text="{Binding Path=Source}">
        </TextBox> 
</StackPanel>
<TextBlock Margin="3" Name="lblSampleText" 
FontSize="{Binding ElementName=sliderFontSize,Path=Value Mode="TwoWay"}"
Text="{Binding ElementName=txtContent,Path=Text}" Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}" ></TextBlock>

也可是使用代码创建绑定:

Binding binding = new Binding();
 binding.Source = sliderFonSize;   
 binging.path=new PropertPath("Value") 
 binding.Mode=BindignMode.TwoWay;
 txt.SetBinding(TextBlock.FontSize,binding)
  1. BindingMode的枚举值有:
  • OneWay
  • TwoWay
  • OneTime:根据源端属性值设置目标属性值,之后的改变会被忽略,除非调用BindingExpression.UpdateTarge方法
  • OneWayToSource:与OneWay类似,但方向相反,目标属性永远不会被更
  • Default:默认值,根据目标属性确定绑定类型.依赖项属性都由一个元数据 FrameworkPropertyMetadata.BindsTwoWayByDefault用于标识oneway绑定还是twoway绑定
  1. 从目标到绑定源端数据更新时(binding mode为twoway或者onewaytosource),更新行为(什么时机更新)由Binding.UpdateSourceTrigger枚举属性控制,UpdateSourceTrigger的值有:
  • PropertyChanged:目标属性发生变化时立即更
  • LostFocus:目标属性发生变化并且目标丢失焦点时更新源
  • Explicit:除非调用BindingExpression.UpdateSource()方法,否则无法更
  • Default:根据目标属性的元数据(FrameworkPropertMetadata.DefaulUpdateSourceTrigger)确定更新行为,大多数属性默认行为是PropertyChange
  1. MultiBinding:将多个对象绑定到一个控件,主要要使用StringFormat
<ListBox ItemsSource="{StaticResource MyData}"> 
<ListBox.ItemTemplate> <DataTemplate> 
<TextBlock><TextBlock.Text> <MultiBinding StringFormat="{}{0} -- Now only {1:C}!">
<Binding Path="Description"/> <Binding Path="Price"/> </MultiBinding> </TextBlock.Text> 
</TextBlock> </DataTemplate>
</ListBox.ItemTemplate> </ListBox>
  1. ObjectDataProvider:从另一个类中获取信息,只用于数据查询,IsAsynchronous=true,可以使ObjectDataProvider在后台执行,这样即使发生异常不会影响绑定控件的显示:
<ObjectDataProvider x:Key="productsProvider" ObjectType="{x:Type local:StoreDB}"
MethodName="GetProducts"></ObjectDataProvider>
  1. WPF中派生自ItemsControl的类都能显示列表,能够支持集合数据绑定的元素包括ListBox,ComboBox,ListView和DataGrid,Menu,Treeview,ItemsControl中有三个重要属性:
  • ItemsSource: 指向一个集合,结合必须支持IEnumerable接口,该集合包含将在列表中显示的所有元素,但基本的IEnumerable接口只支持只读绑定,要使修改能直接反应到绑定的控件上需要使用ObservablCollection类
  • DisplayMemberPath:确定用于显示的 对象的属性,如果未设置 则会显示对象的ToString()方法返回的值
  • ItemTemplates:接受一个数据模板,用于为每个项创建可视化外观
  1. 继承自IEnumerable接口的类型都支持绑定到列表形元素,大多数集合类没有继承INotifyCollectionChanged接口,WPF提供了一个使用INotifyCollectionChanged接口的集合,ObservableCollction类
  2. 将Grid绑定到lstProducts对象的SelectItem属性
<Grid DataContext="{Binding ElementName=lstProducts,Path=SelectedItem}">....</Grid>
  1. 绑定时,被绑定的数据对象可能还不存在(绑定控件对象时可以看该对象在xaml中是否已经定义),这时依然可以在Xaml中绑定对象类属性(Binding Path),然后在代码中生成数据对象后在与控件绑定
  2. WPF列表控件提供了UI虚拟化(UI Virtualization)功能用于提高大列表的性能,UI虚拟化是列表仅为当前显示项创建容器对象的一种技术
  3. 数据验证:用于捕获非法数据,验证提供了以下两种方式捕获非法值:
  • 在数据对象中引发错误.在绑定的数据对象中进行错误检查,但是当发生异常时,用户无法知道,非法值依然在控件中,只是它没有应用到绑定的数据对象
数据对象中引发异常public decimal UnitCost
{
  get {return unitCost;}
  set
  {
    if(value <0)
        throw new ArgumentException("UnitCost cannot be negative.");
    else
     {
       unitCost=value;
       OnPropertyChanged(new PropertyChangedEventArgs("UnitCost"))
     }
  }
}
  • 如果数据非法时要使用户得到通知则需要借助于ExceptionValidationRule验证规则,要使用它必须将它添加到Binding.ValidationRules集合中,这种方式属于绑定级别上的验证
  • ExceptionValidationRule验证:该类捕获在任何位置发生的异常,包括编辑的值不能转换成正确的数据类型时发生的异常,属性设置器或者值转换器抛出的异常。验证失败时,Validation类的附加属性会记录验证错误,WPF会在绑定元素上将Validation.HasError设置为True,WPF自动将控件使用的模板切换到又Validation.ErrorTemplate定义的模板,创建包含错误细节的ValidationError对象,并加到Validation.Errors集合中,如果Binding.NotifyOnValidationError属性设置为True,WPF就会在控件上引发Validation.Error事件
ExceptionValidationRule<TextBox>
  <TextBox.Text>
    <Binding Path="UnitCost" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <ExceptionValidationRule />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
  • DataErrorValidationRule验证:检查对象的IDataErrorInfo接口引发的异常,当修改了一个属性后,IDataErrorInfo中的字符串索引器,以属性名为Key对值进行验证。使用DataErrorValidationRule和IDataErrorInfo对数据进行验证可以正常设置属性,避免在对象属性中进行验证抛出异常
DataErrorValidationRule<TextBox>
  <TextBox.Text>
    <Binding Path="UnitCost" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <DataErrorValidationRule />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
  • 可以通过继承ValidationRule自定义验证类重写Validate方法验证错误
  1. 没有Path的Binding:Binding源本身就是数据且不需要Path来指明,如下绑定表示将Text绑定到字符串类型mystring,mystring本身就是数据.Path后为"."或者空表示绑定source本身
<TextBlock Text="{Binding source={StaticResource ResourceKye=mystring},Path=.}">