WPF绑定

  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)
  2. BindingMode的枚举值有:
    • OneWay

    • TwoWay
    • OneTime:根据源端属性值设置目标属性值,之后的改变会被忽略,除非调用BindingExpression.UpdateTarge方法
    • OneWayToSource:与OneWay类似,但方向相反,用于目标属性是非依赖项属性的情况
    • Default:默认值,根据目标属性确定绑定类型.依赖项属性都由一个元数据 FrameworkPropertyMetadata.BindsTwoWayByDefault用于标识oneway绑定还是twoway绑定
  3. 从目标到绑定源端数据更新时(binding mode为twoway或者onewaytosource),更新行为(什么时机更新)由Binding.UpdateSourceTrigger枚举属性控制,UpdateSourceTrigger的值有:
    • PropertyChanged:目标属性发生变化时立即更新

    • LostFocus:目标属性发生变化并且目标丢失焦点时更新源
    • Explicit:除非调用BindingExpression.UpdateSource()方法,否则无法更新
    • Default:根据目标属性的元数据(FrameworkPropertMetadata.DefaulUpdateSourceTrigger)确定更新行为,大多数属性默认行为是PropertyChanged
  4. 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>
  5. ObjectDataProvider:从另一个类中获取信息,只用于数据查询,IsAsynchronous=true,可以使ObjectDataProvider在后台执行,这样即使发生异常不会影响绑定控件的显示:
    
    
    <ObjectDataProvider x:Key="productsProvider" ObjectType="{x:Type local:StoreDB}"
    MethodName="GetProducts"></ObjectDataProvider>

  6. WPF中派生自ItemsControl的类都能显示列表,能够支持集合数据绑定的元素包括ListBox,ComboBox,ListView和DataGrid,Menu,Treeview,ItemsControl中有三个重要属性:
    • ItemsSource: 指向一个集合,结合必须支持IEnumerable接口,该集合包含将在列表中显示的所有元素,但基本的IEnumerable接口只支持只读绑定,要使修改能直接反应到绑定的控件上需要使用ObservablCollection类

    • DisplayMemberPath:确定用于显示的 对象的属性,如果未设置 则会显示对象的ToString()方法返回的值
    • ItemTemplates:接受一个数据模板,用于为每个项创建可视化外观
  7. 继承自IEnumerable接口的类型都支持绑定到列表形元素,大多数集合类没有继承INotifyCollectionChanged接口,WPF提供了一个使用INotifyCollectionChanged接口的集合,ObservableCollction类
  8. 将Grid绑定到lstProducts对象的SelectItem属性

    <Grid DataContext="{Binding ElementName=lstProducts,Path=SelectedItem}">....</Grid>
  9. 绑定时,被绑定的数据对象可能还不存在(绑定控件对象时可以看该对象在xaml中是否已经定义),这时依然可以在Xaml中绑定对象类属性(Binding Path),然后在代码中生成数据对象后在与控件绑定
  10. WPF列表控件提供了UI虚拟化(UI Virtualization)功能用于提高大列表的性能,UI虚拟化是列表仅为当前显示项创建容器对象的一种技术
  11. 数据验证:用于捕获非法数据
    • ExceptionValidationRule验证:验证失败时,WPF会在绑定元素上将Validation.HasError设置为True,WPF自动将控件使用的模板切换到又Validation.ErrorTemplate定义的模板,创建包含错误细节的ValidationError对象,并加到Validation.Errors集合中,如果Binding.NotifyOnValidationError属性设置为True,WPF就会在控件上引发Validation.Error事件

    • IDataErrorInfo类:在数据对象中引发错误,并且要在binding中设置DataErrorValidationRule验证规则,当修改了一个属性后,IDataErrorInfo中的字符串索引器,以属性名为Key对值进行验证。可以自定义验证类并响应验证错误
  12. 没有Path的Binding:Binding源本身就是数据且不需要Path来指明,如下绑定表示将Text绑定到字符串类型mystring,mystring本身就是数据.Path后为"."或者空表示绑定source本身
  13. <TextBlock Text="{Binding source={StaticResource ResourceKye=mystring},Path=.}">
时间: 2024-12-20 07:17:38

WPF绑定的相关文章

WPF绑定的ListBox获取ListBoxItem及GoToState应用

现公司项目中需要制作一个扇形菜单,菜单项是用ListBox重写Style实现的,其数据是绑定的.菜单的每一项都有Normal,MouseOver和Selected三种状态,这三种状态当然可以通过鼠标移动和点击控制,但现在要通过代码来改变控件外观实现三种状态切换,该如何处理呢?   1.WPF绑定的ListBox获取ListBoxItem WPF中如果ListBox的ItemSource为绑定的,则ListBox.Items为绑定的数据源,而非ListBoxItem.如果直接通过如下代码会发现无法

WPF绑定之索引器值变化通知

背景 在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新. 解决方案 只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyChanged事件,并将属性名称设置为Item[]即可.示例代码如下: public class NotifyDictionary : INotifyPropertyChanged { private readonly Dictionary<string, string> _dictionary = n

WPF快速入门系列(4)——深入解析WPF绑定

一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信息来设置目标对象的属性.目标属性总是依赖属性.然而,源对象可以是任何内容,可以是一个WPF元素.或ADO.NET数据对象或自定义的数据对象等.下面详细介绍了WPF绑定中的相关知识点. 二.绑定元素对象 2.1 如何实现绑定元素对象 这里首先介绍绑定最简单的情况——绑定元素对象,即数据源是一个WPF元

[WPF]绑定到界面的数组不支持调度线程以外对其更改的办法

[原]WPF编程经常遇到一个问题: 某个数组己绑定到主界面某控件中,然后在后台程序中需要对数组增(减)数据,然后程序就会报错, 程序提示:该类型的CollectionView 不支持从调度程序线程以外的线程对其SourceCollection进行的更改. 如下图所示: 既然不能这样操作,就得想一个办法来解决,现在先把把出现错误的程序全部列出来,然后再来根据解决办法进行修改, 本测试程序先建一个学生类: using System; using System.Collections.Generic;

WPF 绑定密码

原文:WPF 绑定密码 我们发现我们无法绑定密码框的密码,PasswordBox 的 Password 不能绑定. 我们想做 MVVM ,我们需要绑定密码,不能使用前台 xaml.cs 监听 密码改变得到密码的值,传到 ViewModel . 本文提供一个简单方法来绑定 WPF 的 PasswordBox 的 Password .这种方法不仅在 WPF 可以使用,在 UWP 也可以使用.关于 UWP 绑定密码,可以在我博客 win10 uwp 绑定密码 查看. 我在网上找的很多大神给出的可以解决

WPF绑定BitMapImage

先说下图片文件存在服务器.wpf常用绑定图片地址没办法用.忽然想到,convert能否转字节数据?实验了下可以. 图片绑定字节数组. convert代码 public class PictureConvert : IValueConverter { /// <summary> /// 转换图片 /// </summary> /// <param name="value"></param> /// <param name="

WPF绑定Radiobutton到enum

WPF中经常会需要用到多个Radiobutton选择项,并且需要将选中的选项映射到某个枚举值enum中. 这种情形的解决办法如下: 1) 需要创建一个UserControl,举个例子代码如下: <UserControl x:Class="ShangfeiXApp.XModeUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="ht

WPF绑定到集合

什么是集合视图? 集合视图是位于绑定源集合顶部的一层,您可以通过它使用排序.筛选和分组查询来导航和显示源集合,而无需更改基础源集合本身.集合视图还维护着一个指向集合中的当前项的指针.如果源集合实现了 INotifyCollectionChanged 接口,则CollectionChanged 事件引发的更改将传播到视图. 如果将控件直接绑定到集合,则 WPF 会绑定到其默认视图.此默认视图由直接到同一集合的所有绑定共享,因此一个绑定控件或代码对默认视图所做的更改(如排序或对当前项指针的更改)会反

WPF 绑定

WPF里分三种Binding:Binding, PriorityBinding, MultiBinding,这三种Binding的基类都是BindingBase,而BindingBase又继承于MarkupExtension Binding 提供对绑定定义的高级别访问,绑定将绑定目标对象(通常为 WPF 元素)的属性与任何数据源(例如数据库.XML 文件或包含数据的任何对象)连接起来. 常见的使用Binding的代码:C# Binding binding = new Binding(); //