- 浏览: 300556 次
文章分类
- 全部博客 (308)
- Apple (1)
- MAC (6)
- iPhone (1)
- iOS (1)
- Adobe (3)
- Microsoft (23)
- Windows (12)
- WAP (2)
- CMPP (6)
- Eclipse (5)
- .NET (13)
- Router (3)
- ADO.NET (2)
- C# (11)
- WPF (3)
- SqlServer (4)
- Facebook (2)
- JDBC (1)
- Visual Studio (10)
- ActiveMQ (9)
- Java (112)
- Memcached (2)
- NoSQL (7)
- Hadoop (9)
- GlassFish (2)
- Linux (98)
- CentOS (58)
- Spring (10)
- Oracle (17)
- JBOSS (12)
- Webservice (4)
- EJB (7)
- DFS (1)
- Hibernate (9)
- Redis (3)
- Tomcat (5)
- Python (8)
- FastDFS (6)
- Nginx (6)
- RabbitMQ (0)
- Erlang (0)
- Lucene (8)
- Solr (7)
- MySQL (1)
- JavaScript (0)
最新评论
-
zhangy888:
你好,我正好也遇到了这个问题,按照您的设置有如下几个问题,请帮 ...
CXF SOAP 1.2 SOAP 1.1 问题 -
u011493586:
这个SUBMIT写的还不错,只是有的地方没看懂
CMPP发送超长短信息(JAVA版) -
u011493586:
...
CMPP发送超长短信息(JAVA版)
同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProperty)只能拥有一个binding。 这一点可以通过设置binding对象的方法名得知: public static BindingExpressionBase SetBinding( DependencyObject target, DependencyProperty dp, BindingBase binding ) 方法名是SetBinding而不是AddBinding。如果想要验证一下,也可以在listView1_SelectionChanged事件方法中增加断点,可以监视到。 当多次在同一个对象上设置Binding时,其实并不会增加多余的binding,而是将原来的binding替换掉了,这里以textBox_ContactID为例如下图: 另一个相对的概念:同一个Binding可以同时与多个对象的多个属性(或同一对象的多个属性)形成Binding。这一点就不做实践验证了,在MSDN上《Data Binding Overview》中有一段“Binding and BindingExpression”就是讲这个道理的。 也许很多读者已经知道或潜意识里有了这种概念,这里只是做一些强调。 改善优化WPF Binding 下面的内容在修正错误的同时,还将对原有的Binding做一些小小的改进。 在上一篇Blog中,我曾经提到过这样一个问题,在将数据库中的DataTable对象的DefaultView通过XAML语言Binding到listView1对象的ItemsSource上时总是失败。 这里顺便公布一下答案,那就是使用DataContext,不过在动手之前先来梳理一下Binding的一些基本概念及使用方法。 在此之前先来点基础知识,都是MSDN上的内容(不过是E文的),感觉不错所以写下来,供大家阅读: l 典型的Binding具有四个重要组成部分:Binding目标对象(binding target object)、目标对象属性(target property)、Binding数据源(binding source)、Path(用于指明要从数据源中取得的值,就是我们通常写的属性名称)。 例如:想要把一个员工(Employee)的姓名(EmpName)Binding显示到一个TextBox的Text属性上。 分析一下其中的4个组成部分:Binding目标对象是TextBox(因为它要最终使用这些数据);目标对象属性是TextProperty(这里要注意,不是Text属性,而是与Text属性相对应的Dependency Property,通常命名是属性名+Property); 数据源是员工(Employee);Path是EmpName。我的经验是:刚开始使用Binding的时候由于还不熟悉,建议在做之前先在心理把这4个部分对号入座一下,等日后就可以熟悉成自然了。 l 目标对象属性一定要是Dependency Property。由于只有DependencyObject类及其子类能够定义Dependency Property,因此,Binding目标对象就必须是DependencyObject类及其子类了。另一方面反过来说,UIElement(DependencyObject的子类)的大多数属性都有与其对应的Dependency Property,因此,大多数的UIElement属性我们都可以利用其Dependency Property作为目标对象属性从而与数据源建立Binding。 l 再有一点,建立Binding的数据源不一定要是一个CLR对象,也可以是XML数据、ADO.NET对象及DependencyObject。 关于为什么binding的对象一定要是DependencyObject,为什么binding对象的属性一定要是dependency property,这个我就不知道了。 在我第一次看到在XAML中设置Binding的语法时,简直是满头雾水。这东西到底怎么回事,简直就没有章法可循,一会儿ElementName,一会儿Source,还有时什么都没有,就一个{Binding },再有就是Mode,UpdateSourceTrigger等,简直没有头绪。 不过只要打开MSDN,看一下System.Windows.Data.Binding对象,似乎开始有点感觉了,查看Binding对象的属性栏(Properties),你会发现,原来我们在XAML中设置Binding时使用的东西和Binding对象的属性好像都是一一对应的。 确实如此,在XAML中设置Binding就是在这只System.Windows.Data.Binding对象,这里先提醒一下大家。 WPF可不是就这么一个Binding噢,实时上,从BindingBase继承过来的有三个兄弟,Binding只是最常用而已。 找到了binding的老家,相信大家对{Binding ElementName=ElemName, Path=PropertyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, …}这样的语法应该清楚了吧。 那么{Binding } 及{Binding XXXX}这样的语法呢?其实可以就是等于new Binding()及new Binding(XXXX),其实可以考虑成是分别使用了Binding的两种构造方法,而XXXX的作用自然也就清晰了。 其实和{Binding Path=XXXX}是等价的,都是设置Path属性的。至于这里的Path属性在我们平常使用时其实是用来设置属性名的地方,为什么不直接叫做是PropertyName之类的名字呢?这个又要留着以后思考了。 当一个数据源与一个UIElement形成Binding后,数据源的改变,如果传递给UIElement的指定属性? 同样,当UIElement中指定属性值改变了,如何才能够通知到数据源?要讨论这个问题,需要按数据源来分类进行讨论。这个分类并不是互斥的之前存在一些交集。 因此,同一种Binding场景可能适用于多种情况。下面的内容是来自MSDN中《Binding Sources Overview》中的内容,由于怕翻译的不好而误导大家,所以分类的名称还是使用英文吧。 Using a CLR Class as the Binding Source Object 在典型的Binding情景中,一个CLR 对象作为数据源,将其中一个属性值Binding到某个UIElement的属性上(以上面显示员工姓名的情景为例。 用XAML实现<TextBox Text=”{Binding Source=Employee, Path=EmpName}” />)。当数据源属性值变化了,相应让UIElement中对应属性变化。 需要实现一个中通知机制,最简单的方法是通过实现INotifyPropertyChanged接口完成此操作。具体实现,可以参考MSDN上的文章《How to: Implement Property Change Notification》。 其实就是实现了”public event PropertyChangedEventHandler PropertyChanged;”事件,通常的做法是在上面加封装一个”protected void OnPropertyChanged(string name)”函数。在属性的set方法结尾处,调用此函数实现通知的作用。 如果不实行此接口,则必须自己实现一套通知系统。为你的类中的每一个想要实现通知机制的属性创建一个PropertyChanged模板。 即为你的每一个属性创建一个名为”PropertyNameChanged”事件,其中PropertyName是与这个事件对应的属性名称。然后在属性发生变化是触发这个事件。(听起来就麻烦,我也懒得去实践验证了) 如果以上两种方法都无法实现的话,那么就只好在你认为需要的时候显示的调用UpdateTarget方法来手动更新了。 (这种方法没用过,感觉已经失去了Binding的意义了) Entire Objects Used as a Binding Source 可以理解为将整个对象作为数据源,与上一个题目的区别很小。 基本上可以认为是原来Binding实现的是数据源属性与UIElement属性之间的Binding,而这次是直接将一个Object对象与一个UIElement的属性进行Binding了。 这种情况可以使用Binding的Source属性指明数据源(假设Employee对象与一个ListBox实现banding,用XAML实现<ListBox ItemsSource=”{Binding Employee}” />),或者还可以将DataContext属性设置为Employee(DataContext属性只有UIElement的一个子类System.Windows.FrameworkElement及其子类才会有)。 这样,在设置ItemsSource时就可以直接使用”{Binding }”这样的语法了。当然,DataContext属性设置成Employee还是需要使用DataContext=”{Binding Employee}”语句的。 有人在这里会嘲笑这一举动实在是啰嗦,事实上,DataContext属性是非常有用的。之所以Binding对象失败而最终不得不使用C#语句进行Binding就是因为没有设置DataContext。 因为,当我们使用{Binding Source= Employee, Path=”EmpName”}设置属性后,WPF查找Source对象是根据Element Tree逐级向上自己的Parent Element查找的,查找每一Element上的DataContext所指定的内容是否包含这一Source内容,并以第一个匹配到的结果作为最终对象。 也就是说,DataContext是按照Element Tree向下继承的,并且决定这WPF在运行时能否找到我们所制定的Source对象。即使我们使用{Binding Path=”EmpName”}的语句也是如此。 比较常见的做法是,当我们有大量的Element需要与一个数据源中的众多属性实现Binding时,我们可以直接在一个公共Parent Element的DataContext上设置这一对象(甚至可以是整个window或page上),这将会极大的加少我们重复的代码量,同时也会是程序更加可读。 当我们需要使用的数据源是一个集合时,如果想要实现改变通知的机制。 同样需要实现一个接口INotifyCollectionChanged用来在集合发生改变时发起,用法单个对象是实现INotifyPropertyChanged接口类似。 首先是将上以前做的不是很好的那一段代码改成XAML语言实现。 将TextBox标签中的Text属性与上面listView1中被选定的记录(listView1.SelectedItem)中对应属性(例如:ContactID)做Binding。 实现后如图所示: <TextBox Text="{Binding ElementName=listView1, Path=SelectedItem.ContactID}" MinWidth="100" /> 看以来代码有点长,而且,下面的几个TextBox也都存在大量的重复内容,这里就可以考虑使用上面所说的DataContext了。 将listView1中被选定的记录(listView1.SelectedItem)作为DataContext放在公共Parent Element上,做法如下: <WrapPanel Grid.Row="1" Orientation="Horizontal" DataContext="{Binding ElementName=listView1, Path=SelectedItem}"> 然后剩下的代码就可以简化很多了: <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Text="ContactID:" TextAlignment="Center" /> <TextBox Text="{Binding ContactID}" MinWidth="100" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Text="FirstName:" TextAlignment="Center" /> <TextBox Text="{Binding FirstName}" MinWidth="100" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Text="LastName:" TextAlignment="Center" /> <TextBox Text="{Binding EmailAddress}" MinWidth="100" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Text="EmailAddress:" TextAlignment="Center" /> <TextBox Text="{Binding LastName}" MinWidth="100" /> </StackPanel> 原来的SelectionChanged事件处理方法现在已经没有用了,将多余的代码去掉: <ListView Name="listView1" SelectionChanged="listView1_SelectionChanged" MinWidth="280" > 后台代码中的对应方法也可以删掉了private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)。 F5 Debug运行一下,结果和原来是完全一样的。 在上一文中无得以选择使用C#实现Binding的部分代码,现在使用XAML语言实现,有几种方案可以选择,通过如下几步实现: 1) 将原先建立给listView1建立Binding那一大串代码删掉,替换成如下代码: listView1.DataContext = dt.DefaultView; 执行结果如下图所示: 2) 将其与listView1的ItemsSource属性建立Binding,设置每一列的header及DisplayMemberBinding值。 这里由于DataContext的原因,ItemsSource可以写成"{Binding }"的形式而其Children Element也都可以简写成"{Binding ContactID}"这样的形式。 <ListView Name="listView1" MinWidth="280" ItemsSource="{Binding }"> <ListView.View> <GridView x:Name="gridView1"> <GridView.Columns> <GridViewColumn DisplayMemberBinding="{Binding ContactID}" Header="ContactID"></GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding FirstName}" Header="FirstName"></GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding LastName}" Header="LastName"></GridViewColumn> </GridView.Columns> </GridView> </ListView.View> </ListView> 改造完后,运行结果会发现,效果和原来是一样。效率提高了,代码更加简化。 WPF入门系列教程(二) 深入剖析WPF Binding的使用方法(全文完)
发表评论
-
vs2010创建ActiveX工程和怎么给ActiveX添加方法
2015-01-13 11:11 799ActiveX控件是注册到电脑上的一个注册库文件,以ocx ... -
VS使用中 coloader80.dll异常
2013-01-04 16:29 1117今天在工作的时候由于不小心直接关掉了正在运行程序的Vis ... -
log4net使用详解
2012-12-08 13:26 905说明:本程序演示如何利用log4net记录程序日志信息。log ... -
WMI Troubleshooting
2012-09-24 14:18 1206When accessing WMI local or rem ... -
net中的WMI编程(二):WMI中的WQL语言和WQL的测试工具
2012-09-24 13:41 973今天临晨本人写了一篇有关.net中WMI编程的入门文章,名 ... -
net中的WMI编程(一):WMI介绍及简单应用
2012-09-24 13:40 795前言: 由于.net的某 ... -
Reflector 已经out了,试试ILSpy
2012-04-09 16:47 1168Reflector是.NET开发中必备 ... -
ADO.NET中SQL Server数据库连接池
2012-04-09 15:43 837连接到数据库服务器 ... -
ADO.NET数据库连接池的介绍
2012-04-09 15:35 985摘录自MSDN: 建立池 ... -
WPF入门教程系列(一) 创建你的第一个WPF项目
2012-03-16 17:11 2297WPF基础知识 快速学习绝不是从零学起的,良好的 ... -
使用 SQL Server Compact 3.5 数据库(设备)
2012-03-16 16:43 1502更新: 2008 年 7 月 Visual Stud ... -
C#调用DLL
2012-03-08 14:42 899每种编程语言调用DLL的方法都不尽相同,在此只对 ...
相关推荐
wpf入门第二篇 MVVM与binding的示例代码,详情可以查看博主的这篇博客: https://blog.csdn.net/wf824284257/article/details/88758707
wpf binding 的两种方法 数据库连接 并显示的两种方法
初学wpf,经常被Binding搞晕,以下记录写Binding的基础。下面这篇文章主要给大家介绍了关于WPF快速入门教程之绑定Binding的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
WPF的binding代码实例 总结的几个binding的基础运用
WPF Binding绑定 对象和view的绑定 界面修改直接改变对象的修改 Command命令 事件的绑定 基础学习源码
WPF Binding转换与校验
WPF Binding,里面有源代码,值得初学者学习
WPF Binding 学习笔记
WPF的bool2Visibility转换器使用
WPF ComboBox的LostFocus绑定Command,其他事件同理实现。
快速掌握 WPF Data Binding 的要訣
Part 3: WPF Data Binding with LINQ to SQL These tutorials describe how to map your classes to your tables manually (rather than with an automated tool like SqlMetal) so that you can have support for M...
wpf 绑定的内容整理,绑定的源:Elementname,Source,RelativeSource,DataContext,分别得介绍,Mode介绍,UpdateSourceTrigger介绍,其中夹杂各种例子
WPF Prism 依赖注入实现可关闭的TabControl。
wpf 给控件绑定静态变量,静态变理改变后控件上的值随着变量的demo,这只是个demo,具体应用场景可以根据实际的情况进行调整,本demo使用 vs2019进行编写。
WPF(WAF框架)一个界面布局引入另一个界面布局
WPF使用Mouse.Capture捕获鼠标在屏幕的位置,不需要Hook
wpf TREE view 入门 现成程序
Microsoft's Windows Presentation Foundation (WPF) provides you with a development framework for building high-quality user experiences for the Windows operating system. It blends together rich content...