Binding基础 文摘
简要
- Binding基础
- Binding源与路径
- 列举Binding的源
Binding基础
从Coding中看Binding的基础。
先定义一个Student类:
public class Student : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string name;
public string Name
{
get
{
return this.name;
}
set
{
name = value;
if (PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}
}
XAML设计:
<StackPanel Height="70">
<TextBox x:Name="textBoxName" BorderBrush="Black" Margin="5"></TextBox>
<Button Content="Add Name" Margin="5" Click="Button_Click"></Button>
</StackPanel>
后台部分:
public partial class MainWindow : Window
{
Student stu;
public MainWindow()
{
InitializeComponent();
stu = new Student();
Binding binding = new Binding();
binding.Source = stu;
binding.Path = new PropertyPath("Name");
BindingOperations.SetBinding(this.textBoxName, TextBox.TextProperty, binding);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
stu.Name += "LiLin";
}
}

在这个例子中,binding的源是stu,binding的路径是Name,既UI关心的那个属性。
首先,定义的Student实现了INotifyPropertyChanged接口,并在Name的set中激发PropertyChanged事件,这是为了是Binding机制能自动监听,并会通知Binding目标端的UI现实新的值。
在后台代码中,Binding部分是先声明Binding类型变量并创建实例,然后指定源与路径,最后使用BindingOperations.SetBinding(…)来实现数据源与目标的连接。
实际中,不需要这么麻烦地实现Binding,因为TextBox继承自FrameworkElement,对BindingOperations.SetBinding(…)进行了封装,提供SetBinding方法:
public BindingExpressionBase SetBinding(DependencyProperty dp, BindingBase binding)
{
return BindingOperations.SetBinding(this, dp, binding);
}
使用SetBinding可以简化为:
InitializeComponent();
stu = new Student();
this.textBoxName.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu });
Binding的源与路径
Binding的源只要是一个对象,且拥有公开的属性。可以是实现了INotifyPropertyChanged接口的自定义类、控件、集合、XML…
把控件作为Binding的源:
<StackPanel Height="70">
<TextBox x:Name="textBoxValue" BorderBrush="Black" Margin="5" Text="{Binding Path=Value, ElementName=slider, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Slider x:Name="slider" Maximum="100" Minimum="0" Margin="5"></Slider>
</StackPanel>

控制Binding的方向和数据更新触发方式:
控制Binding数据流向的属性是Mode,枚举。可以取值为:TwoWay、OneWay、OnTime、OneWayToSource、Default。
控制数据更新触发方式的属性是UpdateSourceTrigger,类型是UpdateSourceTrigger枚举,可以取值为:PropertyChanged、LostFocus、Explicit和Default。
Binding的路径:
Binding的路径是指示Binding关注的属性。
为Binding指定源的几种方法:
- 把普通的CLR类型单一对象指定为Source:该类型需实现INotifyPropertyChanged接口,并通过属性的Set语句里激发PropertyChanged事件;
- 把普通的CLR集合类型对象指定为源:包含数组、List<T>、ObservableCollection<T>等集合类型;
- 把ADO.NET数据对象指定为源:有DataTable和DataView等对象;
- 使用XmlDataProvider把XML数据指定为Source;
- 把以来对象指定为源;
- 把容器的DataContext指定为源;
- 通过ElementName指定源:用于XAML中;
- 通过Binding的RelativeSource属性相对指定Source:当控件需要关注自己的、自己容器的或者自己内部元素的某个值就需要使用到这个属性;
- 把ObjectDataProvider对象指定为源;
- 把使用LINQ检索得到的数据对象作为源。
使用DataContext作为Binding的源:
DataContext是定义在WPF控件基类FrameworkElement中,因此所有WPF控件都有这个属性。
简单例子:
<Window x:Class="BindBasicTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindBasicTest"
Title="MainWindow" Height="150" Width="230">
<StackPanel Height="100">
<StackPanel.DataContext>
<local:Student Id="100" Name="LiLin" Age="18"></local:Student>
</StackPanel.DataContext>
<TextBox Text="{Binding Path=Id}" Margin="5"></TextBox><TextBox Text="{Binding Path=Name}" Margin="5"></TextBox><TextBox Text="{Binding Path=Age}" Margin="5"></TextBox></StackPanel>
</Window>
使用集合对象作为列表控件的ItemsSource:
列表控件都是派生自ItemsControl类,则都继承了ItemsSource这个属性。ItemsSource属性可以接受一个IEnumerable接口的派生类。只要为ItemsControl对象设置ItemsSource属性值,ItemsSource就会自动迭代其中的数据。
例子:
XAML设计:
StackPanel Background="LightBlue">
<TextBlock Text="Student ID" FontWeight="Bold" Margin="5"></TextBlock>
<TextBox x:Name="txtBoxId" Margin="5"></TextBox>
<TextBlock Text="Student List" FontWeight="Bold" Margin="5"></TextBlock>
<ListBox x:Name="listBoxStudent" Height="80"></ListBox>
</StackPanel>
后台代码:public MainWindow()
{InitializeComponent();
List<Student> stu_list = new List<Student>()
{new Student(){Id=0,Name="LiLin",Age=18},new Student(){Id=1,Name="LinLi",Age=20},new Student(){Id=2,Name="LLiin",Age=24},new Student(){Id=3,Name="Tom",Age=27},new Student(){Id=4,Name="Tim",Age=19},new Student(){Id=5,Name="Luke",Age=23},};
this.listBoxStudent.ItemsSource = stu_list;
this.listBoxStudent.DisplayMemberPath = "Name";
this.txtBoxId.SetBinding(TextBox.TextProperty, new Binding("SelectedItem.Id") { Source = this.listBoxStudent });}
this.listBoxStudent.DisplayMemberPath = "Name";这是设置listbox显示字段,如果要显示多个或者全部字段呢。这就要使用到类型为DataTemplate的ItemTemplate属性(继承自ItemsControl类),通俗的说是换衣服。在XAML中修改代码,并把this.listBoxStudent.DisplayMemberPath = "Name";删除:<ListBox x:Name="listBoxStudent" Height="80">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Id}" Width="30" Foreground="Red"></TextBlock><TextBlock Text="{Binding Path=Name}" Width="50"></TextBlock><TextBlock Text="{Binding Path=Age}" Width="30"></TextBlock></StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
注意事项:使用集合对象作为列表控件的ItemsSource时,一般会使用ObservableCollection<T>代替List<T>,理由是,ObservableCollection<T>实现了INotifyCollectionChanged和INotifyPropertyChanged接口。
使用ADO.NET对象作为Binding对象:
在WPF中支持列表控件与DataTable直接建立Binding。假设已经获得了一个DataTable的实例,数据跟以上的一样。现在Coding把它显示在ListBox中:
DataTable dt = Load();
this.listBoxStudent.ItemsSource = dt.DefaultView;
换件“衣服”:
<ListView x:Name="listViewStudent" Height="120" Margin="5">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" Width="60" DisplayMemberBinding="{Binding Id}"></GridViewColumn>
<GridViewColumn Header="Name" Width="80" DisplayMemberBinding="{Binding Name}"></GridViewColumn>
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>

有点注意的:ListView和GridView不是同一级别的控件。ListView是继承自ListBox,GridView是ViewBase的派生类,ListView的View属性是ViewBase的对象。因此,GridView可以作为ListView的View来使用。
如果想用更复杂的结构来表示标题或者数据,可以为GridViewColumn设置HeaderTemplate和CellTemplate属性,类型都是DataTemplate。
使用XML数据作为Binding的源:
现在程序中涉及到数据传输都离不开XML。XML文本是树形结构,可以方便地用于表示线性集合。
先Coding一个:
有这么一个Student.xml,
<?xml version="1.0" encoding="utf-8" ?>
<StudentList>
<Student Id="1">
<Name>LiLin</Name>
</Student>
<Student Id="2">
<Name>Tom</Name>
</Student>
<Student Id="3">
<Name>Tim</Name>
</Student>
<Student Id="4">
<Name>Luke</Name>
</Student>
<Student Id="5">
<Name>Jake</Name>
</Student>
<Student Id="6">
<Name>LiLi</Name>
</Student>
</StudentList>
XAML:
<ListView x:Name="listViewStudent" Height="120" Margin="5">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" Width="60" DisplayMemberBinding="{Binding XPath=@Id}"></GridViewColumn>
<GridViewColumn Header="Name" Width="80" DisplayMemberBinding="{Binding XPath=Name}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
后台:
mlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Student.xml");
XmlDataProvider xdp = new XmlDataProvider();
xdp.Document = xdoc;
xdp.XPath = @"/StudentList/Student";
this.listViewStudent.DataContext = xdp;
this.listViewStudent.SetBinding(ListView.ItemsSourceProperty, new Binding());
注意:XAML中DisplayMemberBinding="{Binding XPath=@Id}"和DisplayMemberBinding="{Binding XPath=Name}"之间的@差异,指明了关注的xml路径不同,使用@表示是XML元素的Attribute,不加的是指子集元素。
使用LINQ检索结果作为Binding的源:
因为LINQ查询结果是一个IEnumerable<T>类型的对象,而IEnumerable<T>继承了IEnumerable,所以它可以作为列表控件的ItemsSource来使用。
Coding:
List<Student> stu_list = new List<Student>()
{
new Student(){Id=0,Name="LiLin",Age=18},
new Student(){Id=1,Name="LinLi",Age=20},
new Student(){Id=2,Name="LLiin",Age=24},
new Student(){Id=3,Name="Tom",Age=27},
new Student(){Id=4,Name="Tim",Age=19},
new Student(){Id=5,Name="Luke",Age=23},
};
this.listViewStudent.ItemsSource = from stu in stu_list where stu.Age <= 20 select stu;
Binding基础 文摘的更多相关文章
- 6.2 Binding基础
WPF最为核心的思想是数据驱动UI,实现这一技术的基石就是绑定技术(binding).如果把Binding比作数据的桥梁,那么它的两端分别是源(Source)和目标(Target),Binging是架 ...
- WPF基础知识、界面布局及控件Binding(转)
WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...
- WPF基础知识、界面布局及控件Binding
WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...
- Binding笔记
Binding基础 绑定某个对象的属性值到控制上,写法如下: public class Order : INotifyPropertyChanged//只要实现此接口 { public event ...
- Binding
Binding基础 绑定某个对象的属性值到控制上,写法如下: public class Order : INotifyPropertyChanged//只要实现此接口 { public event ...
- WPF之Binding深入探讨
原文:http://blog.csdn.net/fwj380891124/article/details/8107646 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在 ...
- WPF的Binding功能解析
1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...
- WPF之Binding深入探讨--Darren
1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...
- binding(转)
1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...
随机推荐
- python解析json文件报错No JSON object could be decoded
2017-04-25 可用Nodepad++将json文件打开并以UTF8无BOM格式保存.
- 2016.6.30 tomcat开启时,显示端口被占用,如何修改端口
开启tomcat时,有时候会显示端口8080已占用,所以需要将端口改为其他值. 找到tomcat的server.xml文件,修改为8088,如图所示:
- Windows远程CentOS桌面
Windows远程CentOS桌面 1.VNC 服务器配置 1) 安装vncserver yum install -y vnc-server 2) 修改配置 vi /etc/sysconfig/vnc ...
- [Tools] Support VS Code Navigation and Autocomplete Based on Webpack Aliases with jsconfig.json
It's common to setup Webpack aliases to make imports much more convenient, but then you lose the abi ...
- Android NDK生成共享库和静态库
Date: 2014-03-14 Title: Compile Android Native Binary And Library Published: true Type: post Tags: A ...
- 有关CGRectGetMinX,CGRectGetMidX,CGRectGetMaxX图解
CGRect size = CGRectMake(20, 20, 400, 400); //矩形中最小x值 ,size.x CGRectGetMinX(size) = 20; //矩形中最小y值 ,s ...
- Android学习(二十三)SubMenu 子菜单
一.SubMenu子菜单 和功能菜单相似,但是可以添加子菜单. 二.实现步骤: 1.通过onCreateOptionsMenu方法创建子菜单,可以通过代码动态创建,也可以通过xml进行创建. 2.通过 ...
- C# : 资源文件(多用于处理国际化)
1.建立Resource文件夹,添加资源文件 处理国际化的问题,我们可以添加多个资源文件,如下就是添加一个中文的,一个英文的. 2.向其中添加键值对. 3.取值 CultureInfo uiCultu ...
- JS与原生OC/Swift相互调用总结
代码地址如下:http://www.demodashi.com/demo/12754.html JS-OC-Swift JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式 1.使用UI ...
- iOS仿支付宝首页的刷新布局效果
代码地址如下:http://www.demodashi.com/demo/12753.html XYAlipayRefreshDemo 运行效果 动画效果分析 1.UI需要变动,向上滑动的时候,顶部部 ...