1.1 Data BindingÔÚWPFÖеĵØÎ»
³ÌÐòµÄ±¾ÖÊÊÇÊý¾Ý+Ëã·¨¡£Êý¾Ý»áÔÚ´æ´¢¡¢Âß¼ºÍ½çÃæÈý²ãÖ®¼äÁ÷ͨ£¬ËùÒÔÕ¾ÔÚÊý¾ÝµÄ½Ç¶ÈÉÏÀ´¿´£¬ÕâÈý²ã¶¼ºÜÖØÒª¡£µ«Ëã·¨ÔÚ3²ãÖеķֲ¼ÊDz»¾ùÔȵ쬶ÔÓÚÒ»¸ö3²ã½á¹¹µÄ³ÌÐòÀ´Ëµ£¬Ëã·¨Ò»°ã·Ö²¼ÔÚÕ⼸´¦£º
A¡£Êý¾Ý¿âÄÚ²¿¡£
B¡£¶ÁÈ¡ºÍд»ØÊý¾Ý¡£
C¡£ÒµÎñÂß¼¡£
D¡£Êý¾Ýչʾ¡£
E¡£½çÃæÓëÂß¼µÄ½»»¥¡£
A,BÁ½²¿·ÖµÄËã·¨Ò»°ã¶¼·Ç³£Îȶ¨£¬²»»áÇáÒ×È¥¸Ä¶¯£¬¸´ÓÃÐÔÒ²ºÜ¸ß£»C´¦Óë¿Í»§ÐèÇó×î½ôÃÜ£¬×ÔÓ£¬±ä»¯×î´ó£¬´ó¶àÉÙËã·¨¶¼¼¯ÖÐÔÚÕâÀï¡£D,E¸ºÔðUIºÍÂß¼µÄ½»»¥£¬Ò²Õ¼ÓÐÒ»¶¨Á¿µÄËã·¨¡£
ÏÔÈ»£¬C²¿·ÖÊdzÌÐòµÄºËÐÄ£¬ÊÇ¿ª·¢µÄÖØÖÐÖ®ÖØ£¬ËùÒÔÎÒÃÇÓ¦¸Ã°Ñ¾«Á¦¼¯ÖÐÔÚC²¿·Ö¡£È»¶ø£¬D,EÁ½²¿·ÖÈ´¾³£³ÉΪÂé·³µÄÀ´Ô´¡£Ê×ÏÈÕâÁ½²¿·Ö¶¼ÓëÂß¼½ôÃÜÏà¹Ø£¬Ò»²»Ð¡ÐľÍÓпÉÄܰѱ¾À´¸Ã·ÅÔÚÂß¼²ãÀïÃæµÄË㷨д½øÕâÁ½²¿·Ö£¨ËùÒÔ²ÅÓÐÁËMVC¡¢MVPµÈģʽÀ´±ÜÃâÕâÖÖÇé¿ö³öÏÖ£©¡£Æä´Î£¬ÕâÁ½²¿·ÖÒÔÏûÏ¢»òÕßʼþµÄ·½Ê½ÓëÂß¼²ã¹µÍ¨£¬Ò»µ©³öÏÖͬһ¸öÊý¾ÝÐèÒªÔÚ¶à³öչʾ/ÐÞ¸Äʱ£¬ÓÃÓÚͬ²½µÄ´úÂë´í×Û¸´ÔÓ£»×îºó£¬DºÍE±¾À´ÊÇ»¥ÄæµÄÒ»¶Ô¶ù¡£µ«È´ÐèÒª·Ö¿ªÀ´Ð´-----ÏÔʾÊý¾Ýдһ¸öËã·¨£¬ÐÞ¸ÄÊý¾ÝÔÙдһ¸öËã·¨¡£×ÜÖ®µ¼ÖµĽá¹û¾ÍÊÇDºÍEÁ½²¿·Ö»áռȥһ²¿·ÖËã·¨£¬¸ã²»ºÃ»¹»áÇ£³¶²»ÉÙ¾«Á¦¡£
ÎÊÌâµÄ¸ùÔ´ÔÚÓÚÂß¼²ãºÍչʾ²ãµÄµØÎ»²»¹Ì¶¨------µ±ÊµÏÖ¿Í»§ÐèÇóµÄʱºò£¬Âß¼²ãµÄÈ·´¦ÓÚºËÐĵØÎ»¡£µ«µ½ÁËʵÏÖUIµÄʱºò£¬Õ¹Ê¾²ãÓÖ´¦ÓÚºËÐĵĵØÎ»¡£WPF×÷ΪһÖÖרҵµÄչʾ²ã¼¼Êõ£¬»ªÀöµÄÍâ¹ÛºÍ¶¯»Ö»ÊÇËüµÄ±í²ãÏÖÏó£¬×îÖØÒªµÄÊÇËûÔÚÉî²ã´ÎÉϰѳÌÐòÔ±µÄ˼ά¹Ì¶¨ÔÚÁËÂß¼²ã£¬ÈÃչʾ²ãÓÀÔ¶´¦ÓÚÂß¼²ãµÄ´ÓÊôµØÎ»¡£WPF¾ßÓÐÕâÖÖÄÜÁ¦µÄ¹Ø¼üÔÚÓÚËüÒýÈëÁËData
Binding¸ÅÄî¼°ÓëÖ®ÅäÌ×µÄDependency PropertyϵͳºÍDataTemplate¡£
´Ó´«Í³µÄWinform×ªÒÆµ½WPFÉÏ£¬¶ÔÓÚÒ»¸öÈý²ã³ÌÐò¶øÑÔ£¬Êý¾Ý´æ´¢²ãÓÉÊý¾Ý¿âºÍÎļþϵͳ×é³É£¬Êý¾Ý´«ÊäºÍ´¦ÀíÈÔȻʹÓÃ.NetFrameworkµÄADO.NETµÈ»ù±¾ÀࣨÓëWinform¿ª·¢Ò»Ñù£©¡£Õ¹Ê¾²ãÔòʹÓÃWPFÀà¿âÀ´ÊµÏÖ£¬¶øÕ¹Ê¾²ãºÍÂß¼²ãµÄ¹µÍ¨¾ÍʹÓÃData
BindingÀ´ÊµÏÖ¡£¿É¼û£¬Data BindingÔÚWPFÖÐËùÆðµÄ×÷ÓþÍÊǸßËÙ¹«Â·µÄ×÷Óá£ÓÐÁËÕâÌõ¸ßËÙ¹«Â·£¬¼Ó¹¤ºÃµÄÊý¾Ý×Ô¶¯ËÍ´ïÓû§½çÃæ²¢¼ÓÒÔÏÔʾ£¬±»Óû§Ð޸ĹýµÄÊý¾ÝÒ²»á×Ô¶¯´«»ØÒµÎñÂß¼²ã£¬Ò»µ©Êý¾Ý±»¼Ó¹¤ºÃÓֻᱻËÍÍù½çÃæ¡£¡£¡£¡£³ÌÐòµÄÂß¼²ã¾ÍÏñÊÇÒ»¸öÇ¿ÓÐÁ¦µÄÒýÇæÒ»Ö±ÔÚÔË×÷£¬Óüӹ¤ºÃµÄÊý¾ÝÇý¶¯Óû§½çÃæÒ²ÎÄ×Ö¡¢Í¼ÐΡ¢¶¯»µÈÐÎʽ°ÑÊý¾ÝÏÔʾ³öÀ´------Õâ¾ÍÊÇÊý¾ÝÇý¶¯UI¡£
ÒýÈëData BindingÖ®ºó£¬D,EÁ½²¿·Ö±»¼ò»¯Á˺ܶࡣÊ×ÏÈ£¬Êý¾ÝÔÚÂß¼²ãºÍÓû§½çÃæÖ±À´Ö®È¥¡¢²»Éæ¼°Âß¼ÎÊÌ⣬ÕâÑùµÄÓû§½çÃæ²¿·Ö»ù±¾Éϲ»°üº¬Ëã·¨£ºData
Binding±¾Éí¾ÍÊÇË«ÏòͨÐÅ£¬ËùÒÔÏ൱ÓÚ°ÑDºÍEºÏ¶þΪһ£»¶ÔÓÚ¶à¸öUIÔªËØ¹Ø×¢Í¬Ò»¸öÊý¾ÝµÄÇé¿ö£¬Ö»ÐèÒªÓÃData
Binding½«ÕâЩUIÔªËØºÍÊý¾ÝÒ»Ò»¹ØÁªÉÏ£¨ÒÔÊý¾ÝΪÖÐÐĵÄÐÇÐνṹ£©£¬µ±Êý¾Ý±ä»¯ºó£¬ÕâЩUIÔªËØ»áͬ²½ÏÔʾÕâÒ»±ä»¯¡£Ç°ÃæÌáµ½µÄÎÊÌâÒ²¶¼ÓÈжø½âÁË¡£¸üÖØÒªµÄÊǾ¹ýÕâÑùµÄÓÅ»¯£¬ËùÓÐÓëÒµÎñÂß¼Ïà¹ØµÄËã·¨¶¼´¦ÔÚÒµÎñÂß¼²ã£¬Âß¼²ã³ÉÁËÒ»¸ö¿ÉÒÔ¶ÀÁ¢ÔËת£¬ÍêÕûµÄÌåϵ£¬¶øÓû§½çÃæÔò²»ÐèÒªÈκÎÂß¼´úÂë¡£ÍêÈ«ÒÀÀµºÍ´ÓÊôÓÚÒµÎñÂß¼²ã¡£ÕâÑù×öÓÐÁ½¸öÏÔ¶øÒ×¼ûµÄºÃ´¦£¬µÚÒ»£ºÈç¹û°ÑUI¿´×öÊÇÓ¦ÓóÌÐòµÄƤ£¬°Ñ´æ´¢²ãºÍÂß¼²ã¿´×÷ÊdzÌÐòµÄÈ¿£¬ÎÒÃÇ¿ÉÒÔºÜÇáÒ×µÄ°ÑÆ¤ËºÏÂÀ´»»Ò»¸öеġ£µÚ¶þ£ºÒòΪÊý¾Ý²ãÄܹ»¶ÀÁ¢ÔË×÷£¬×Ô³ÉÌåϵ£¬ËùÒÔÎÒÃÇ¿ÉÒÔ½øÐиüÍêÉÆµÄµ¥Ôª²âÊÔ¶øÎÞÐè½èÖúUI×Ô¶¯»¯²âÊÔ¹¤¾ß----ÄãÍêÈ«¿ÉÒ԰ѵ¥Ôª²âÊÔ¿´×÷ÊÇÒ»¸ö¡°¿´²»¼ûµÄUI¡±£¬µ¥Ôª²âÊÔÖ»ÊÇʹÓÃÕâ¸öUIÈÆ¹ýÕæÊµµÄUIÖ±½Ó²âÊÔÒµÎñÂß¼°ÕÁË¡£
1.2 Binding »ù´¡
Èç¹û°ÑBinding±È×÷Êý¾ÝµÄÇÅÁº£¬ÄÇôËüµÄÁ½¶Ë·Ö±ðÊÇÔ´(Source)ºÍÄ¿±ê(Target)¡£Êý¾Ý´ÔÄÄÀïÀ´ÄÄÀï¾ÍÊÇÔ´£¬µ½ÄÄÀïÈ¥ÄÄÀï¾ÍÊÇÄ¿±ê¡£Ò»°ãÇé¿öÏ£¬BindingµÄÔ´ÊÇÒµÎñÂß¼²ãµÄ¶ÔÏó£¬BindingµÄÄ¿±êÊÇUI²ãµÄ¿Ø¼þ¶ÔÏó¡£ÕâÑùÊý¾Ý¾Í»áÔ´Ô´²»¶ÏµÄͨ¹ýBindingËÍ´ïUI½çÃæ£¬±»UI²ãÕ¹ÏÖ£¬Õâ¾ÍÍê³ÉÁËÊý¾ÝÇý¶¯UIµÄ¹ý³Ì¡£ÓÐÁËÕâ×ùÇÅÁº£¬ÎÒÃDz»½ö¿ÉÒÔ¿ØÖƳµÁ¾ÔÚÔ´ÓëÄ¿±êÖ®¼äÊÇË«ÏòͨÐл¹Êǵ¥ÏòͨÐС£»¹¿ÉÒÔ¿ØÖÆÊý¾ÝµÄ·ÅÐÐʱ»ú£¬ÉõÖÁ¿ÉÒÔÔÚÇÅÉϴһЩ¹Ø¿¨ÓÃÀ´×ª»»Êý¾ÝÀàÐÍ»òÕß¼ìÑéÊý¾ÝµÄÕýÈ·ÐÔ¡£
ͨ¹ý¶ÔBindingÓÐÁËÒ»¸ö»ù±¾¸ÅÄîÖ®ºó£¬ÈÃÎÒÃÇ¿´Ò»¸ö×î»ù±¾µÄÀý×Ó¡£Õâ¸öÀý×ÓÊÇ´´½¨Ò»¸ö¼òµ¥µÄÊý¾ÝÔ´²¢Í¨¹ýBinding°ÑËüÁ¬½Óµ½UIÔªËØÉÏ¡£
Ê×ÏÈ£¬ÎÒÃÇ´´½¨Ò»¸öÃûΪ"Student"µÄÀ࣬Õâ¸öÀàµÄʵÀý½«×÷ΪÊý¾ÝÔ´À´Ê¹Óá£
public class Student { private string name; public string Name { get { return name; } set { name = value; } } |
Õâ¸öÀàºÜ¼òµ¥£¬¼òµ¥µ½Ö»ÓÐÒ»¸östringÀàÐ͵ÄNameÊôÐÔ¡£Ç°ÃæËµ¹ýÊý¾ÝÔ´ÊÇÒ»¸ö¶ÔÏó£¬Ò»¸ö¶ÔÏó±¾Éí¿ÉÄÜ»áÓкܶàÊý¾Ý£¬ÕâЩÊý¾ÝÓÖͨ¹ýÊôÐÔ±©Â¶¸øÍâ½ç¡£ÄÇôÆäÖÐÄĸöÔªËØÊÇÄãÏëͨ¹ýBindingËÍ´ïUIÔªËØµÄÄØ£¬»»¾ä»°Ëµ£¬UIÔªËØ¹ØÐĵÄÊÇÄĸöÊôÐÔÖµµÄ±ä»¯ÄØ£¿Õâ¸öÊôÐÔÖµ³ÆÖ®ÎªBindingµÄ·¾¶£¨Path£©¡£µ«¹âÓÐÊôÐÔ»¹²»ÐÐ-------BindingÊÇÒ»ÖÖ×Ô¶¯»úÖÆ£¬µ±Öµ±ä»¯ºóÊôÐÔÒªÓÐÄÜÁ¦Í¨ÖªBinding£¬ÈÃBinding°Ñ±ä»¯´«µÝ¸øUIÔªËØ¡£ÔõÑù²ÅÄÜÈÃÒ»¸öÊôÐԾ߱¸ÕâÖÖ֪ͨBindingÖµÒѾ¸Ä±äµÄÄÜÁ¦ÄØ£¿·½·¨ÊÇÔÚÊôÐÔµÄSetÓï¾äÖм¤·¢Ò»¸öPropertyChangedʼþ¡£Õâ¸öʼþ²»ÐèÒªÎÒÃÇ×Ô¼ºÉùÃ÷£¬ÎÒÃÇÒª×öµÄÊÂÊÇÈÃ×÷ΪÊý¾ÝÔ´µÄÀàʵÏÖSystem.ComponentModelÃû³Æ¿Õ¼äÖеÄINotifyPropertyChanged½Ó¿Ú¡£µ±ÎªBindingÉèÖÃÁËÊý¾ÝÔ´Ö®ºó£¬Binding¾Í»á×Ô¶¯ÕìÌýÀ´×ÔÕâ¸ö½Ó¿ÚPropertyChangedʼþ¡£
ʵÏÖINotifyPropertyChanged½Ó¿ÚµÄÀà¿´ÆðÀ´ÊÇÕâÑù£º
public class Student : INotifyPropertyChanged { private string name; public string Name { get { return name; } set { name = value; if (PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name")); } } } public event PropertyChangedEventHandler PropertyChanged; } |
¾¹ýÕâÑùÒ»Éý¼¶£¬µ±NameÊôÐÔµÄÖµ·¢Éú±ä»¯Ê±PropertyChangedʼþ¾Í»á±»¼¤·¢£¬Binding½ÓÊÕµ½Õâ¸öʼþºó·¢ÏÖʼþµÄÏûÏ¢¸æËßËüÊÇNameÊôÐÔÖµ·¢ÉúÁ˱仯£¬ÓÚÊÇ֪ͨBindingÄ¿±ê¶ËµÄUIÔªËØÏÔʾеÄÖµ¡£
È»ºóÎÒÃÇÔÚ´°ÌåÉÏ×¼±¸Ò»¸öTextBoxºÍButton£¬´úÂëÈçÏÂ:
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBox Height="23" HorizontalAlignment="Left" Margin="185,43,0,0"
Name="textBox1" VerticalAlignment="Top" Width="120" /> <Button Content="Button" Height="23" HorizontalAlignment="Left"
Margin="209,96,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> </Grid> </Window> |
ºǫ́´úÂëÕâÑùд:
/// <summary> /// MainWindow.xaml µÄ½»»¥Âß¼ /// </summary> public partial class MainWindow : Window { Student stu = null; public MainWindow() { InitializeComponent(); stu = new Student(); Binding bind = new Binding(); bind.Source = stu; bind.Path = new PropertyPath("Name"); this.textBox1.SetBinding(TextBox.TextProperty, bind); } private void button1_Click(object sender, RoutedEventArgs e) { stu.Name += "f"; new Window1().Show(); } } |
ÈÃÎÒÃÇÖð¾ä½âÊÍÒ»ÏÂÕâ¶Î´úÂ룬Õâ¶Î´úÂëÊÇMainWIndowµÄºǫ́´úÂ룬ËüµÄǰ¶Ë´úÂë¾ÍÊÇÉÏÃæµÄXAML´úÂë¡£¡°Student
stu;¡±ÊÇΪMainWindowÉùÃ÷Ò»¸öStudentÀàÐ͵ijÉÔ±±äÁ¿£¬ÕâÑù×öµÄÄ¿µÄÊÇΪÁËÔÚMainWindowµÄ¹¹ÔìÆ÷ºÍButton.Clickʼþ´¦ÀíÆ÷Öж¼¿ÉÒÔ·ÃÎʵ½ÓÉËüÒýÓõÄStudentʵÀý£¨Êý¾ÝÔ´£©¡£
ÔÚMainWindowµÄ¹¹ÔìÆ÷ÖС°InitializeComponent();¡±ÊÇ×Ô¶¯Éú³ÉµÄ´úÂ룬ÓÃ;Êdzõʼ»¯UIÔªËØ¡£¡°stu=new
Student();¡±Õâ¾äÊÇ´´½¨Ò»¸öStudentʵÀý²¢ÓÃstu³ÉÔ±±äÁ¿ÒýÓÃËü£¬Õâ¸ö¶ÔÏó¾ÍÊÇÎÒÃǵÄÊý¾ÝÔ´¡£
ÔÚ×¼±¸BindingµÄ²¿·Ö£¬ÏÈʹÓá°Binding bind = new Binding();¡±ÉùÃ÷BindingÀàÐͱäÁ¿²¢´´½¨ÊµÀý£¬È»ºóʹÓá°bind.Source=stu;¡±ÎªBindingʵÀýÖ¸¶¨Êý¾ÝÔ´£¬×îºóʹÓá°bind.Path=
new PropertyPath('Name')¡±Óï¾äΪBindingÖ¸¶¨·ÃÎÊ·¾¶¡£
°ÑÊý¾ÝÔ´ºÍÄ¿±êÁ¬½ÓÔÚÒ»ÆðµÄÈÎÎñÊÇʹÓá°BindingOperations.SetBinding(...)¡±·½·¨Íê³ÉµÄ£¬Õâ¸ö·½·¨µÄ3¸ö²ÎÊýÊÇÎÒÃǼÇÒäµÄÖØµã£º
µÚÒ»¸ö²ÎÊýÊÇÖ¸¶¨BindingµÄÄ¿±ê£¬±¾ÀýÖеÄthis.textBoxName¡£
ÓëÊý¾ÝÔ´µÄPathÔÀíÀàËÆ£¬µÚ¶þ¸ö²ÎÊýÓÃÓÚΪBindingÖ¸Ã÷ΪBindingÖ¸Ã÷°ÑÕâ¸öÊý¾ÝËÍ´ïÄ¿±êµÄÄĸöÊý¾Ý¡£
µÚÈý¸ö²ÎÊýºÜÃ÷ÏÔ£¬¾ÍÊÇÖ¸¶¨Ê¹ÓÃÄĸöBindingʵÀý½«Êý¾ÝÔ´ºÍÄ¿±ê¹ØÁªÆðÀ´¡£
ÔËÐгÌÐò£¬µ¥»÷°´Å¥ÎÒÃǽ«»á¿´µ½ÈçϵÄЧ¹ûͼ:

ͨ¹ýÉÏÃæµÄÀý×Ó£¬ÎÒÃÇÒѾÔÚÍ·ÄÔÖн¨Á¢ÆðÀ´ÈçͼËùʾµÄÄ£ÐÍ

ÏÈÓÃÕâ¸ö×ö»ù´¡£¬ºóÃæÎÒÃǽ«Ñо¿BindingµÄÿ¸öÌØµã¡£
1.3 BindingµÄÔ´Óë·¾¶
Binding µÄÔ´Ò²¾ÍÊÇÊý¾ÝµÄÔ´Í·¡£Binding¶ÔÔ´µÄÒªÇó²¢²»¿Á¿Ì------Ö»ÒªËüÊÇÒ»¸ö¶ÔÏ󣬲¢ÇÒͨ¹ýÊôÐÔ(Property)¹«¿ª×Ô¼ºµÄÊý¾Ý£¬Ëü¾ÍÄÜ×÷ΪBinding
µÄÔ´¡£
Ç°ÃæÒ»¸öÀý×ÓÒѾÏò´ó¼ÒÖ¤Ã÷£¬Èç¹ûÏëÈÃ×÷ΪBindingÔ´µÄ¶ÔÏó¾ßÓÐ×Ô¶¯Í¨ÖªBinding×Ô¼ºÊôÐÔÖµÒѾÒѾ±ä»¯µÄÄÜÁ¦¡£ÄÇô¾ÍÐèÒªÈÃÀàʵÏÖINotifyChanged½Ó¿Ú²¢ÔÚÊôÐÔµÄSetÓï¾äÖм¤·¢PropertyChangedʼþ¡£ÔÚÈÕ³£Éú»îÖУ¬³ýÁËʹÓÃÕâÖÖ¶ÔÏó×÷ΪÊý¾ÝÔ´Ö®Í⣬ÎÒÃÇ»¹Óиü¶àµÄÑ¡Ôñ£¬±ÈÈç¿Ø¼þ°Ñ×Ô¼ºµÄÈÝÆ÷»ò×Ó¼¯ÔªËص±Ô´¡¢ÓÃÒ»¸ö¿Ø¼þ×öΪÁíÒ»¸ö¿Ø¼þµÄÊý¾ÝÔ´£¬°Ñ¼¯ºÏ×÷ΪItemControlµÄÊý¾ÝÔ´¡¢Ê¹ÓÃXML×÷ΪTreeView»òMenuµÄÊý¾ÝÔ´¡£°Ñ¶à¸ö¿Ø¼þ¹ØÁªµ½Ò»¸ö¡°Êý¾ÝÖÆ¸ßµã¡±ÉÏ£¬ÉõÖÁ¸É´à²»¸øBindingÖ¸¶¨Êý¾ÝÔ´¡¢ÈÃËû×Ô¼ºÈ¥ÕÒ¡£ÏÂÃæÎÒÃǾͷÖÊöÕâЩÇé¿ö¡£
1.3.1 °Ñ¿Ø¼þ×÷ΪBindingÔ´ÓëBinding±ê¼ÇÀ©Õ¹¡£
Ç°Ãæ½²¹ý£¬´ó¶àÊýÇé¿öÏÂBindingµÄÔ´ÊÇÂß¼²ã¶ÔÏ󣬵«ÓеÄʱºòΪÁËÈÃUI²úÉúÁª¶¯Ð§¹ûÒ²»áʹÓÃBindingÔڿؼþ¼ä½¨Á¢¹ØÁª¡£ÏÂÃæµÄ´úÂëÊǰÉÒ»¸öTextBoxµÄTextÊôÐÔ¹ØÁªµ½SliderµÄValueµÄÊôÐÔÉÏ¡£
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="321" Width="401"> <Grid> <TextBox Height="23" HorizontalAlignment="Left" Margin="141,46,0,0" Name="textBox1"
VerticalAlignment="Top" Width="120" Text="{Binding Path=Value,ElementName=slider1}"/> <Slider Height="23" HorizontalAlignment="Left" Margin="84,106,0,0"
Name="slider1" VerticalAlignment="Top" Width="212" /> <Button Content="Button" Height="23" HorizontalAlignment="Left"
Margin="166,197,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> </Grid> </Window> |
ÔËÐÐЧ¹ûÈçÏÂͼ:

ÕýÈç´ó¼ÒËù¼û£¬³ýÁË¿ÉÒÔÔÚC#Öн¨Á¢BindingÍâÔÚXAML´úÂëÀïÒ²¿ÉÒÔ·½±ãµÄÉèÖÃBinding£¬Õâ¾Í¸øÉè¼ÆÊ¦ºÜ´óµÄ×ÔÓɶÈÀ´¾ö¶¨UIÔªËØÖ®¼äµÄ¹ØÁªÇé¿ö¡£ÖµµÃ×¢ÒâµÄÊÇ£¬ÔÚC#´úÂëÖУ¬¿ÉÒÔ·ÃÎÊÔÚXAMLÖÐÉùÃ÷µÄ±äÁ¿µ«ÊÇXAMLÖв»ÄÜ·ÃÎÊC#ÖÐÉùÃ÷µÄ±äÁ¿£¬Òò´Ë£¬ÒªÏëÔÚXAMLÖн¨Á¢UIÔªËØºÍÂß¼¶ÔÏóµÄBinding»¹ÒªÆÄ·ÑЩÖÜÕÛ£¬°ÑÂß¼´úÂëÉùÃ÷ΪXAMLÖеÄ×ÊÔ´£¨Resource£©£¬ÎÒÃÇ·Å×ÊÔ´Ò»ÕÂÈ¥½²¡£
»ØÍ·À´¿´XAML´úÂ룬ËüʹÓÃÁËBinding±ê¼ÇÀ©Õ¹Óï·¨£º
<TextBox Height="23" HorizontalAlignment="Left" Margin="141,46,0,0" Name="textBox1"
VerticalAlignment="Top" Width="120" Text="{Binding Path=Value,ElementName=slider1}"/> |
ÓëÖ®µÈ¼ÛµÄC#´úÂëÊÇ£º
this.textBox1.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName="Slider1"}); |
ÒòΪBindingÀàµÄ¹¹ÔìÆ÷±¾Éí¾ßÓпÉÒÔ½ÓÊÕPathµÄ²ÎÊý£¬ËùÒÔÒ²³£Ð´×÷:
<TextBox Height="23" HorizontalAlignment="Left" Margin="141,46,0,0" Name="textBox1"
VerticalAlignment="Top" Width="120" Text="{Binding Value,ElementName=slider1}"/> |
×¢Òâ:
ÒòΪÎÒÃÇÔÚC#´úÂëÖпÉÒÔÖ±½Ó·ÃÎʿؼþ¶ÔÏó£¬ËùÒÔÒ»°ã²»»áʹÓÃBindingµÄElementNameÊôÐÔ£¬¶øÊÇÖ±½Ó¸³Öµ¸øBindingµÄSoureceÊôÐÔ¡£
BindingµÄ±ê¼ÇÀ©Õ¹Óï·¨£¬³õ¿´ÓÐЩƽµÉõÖÁÓÐЩ±ðŤ£¬µ«Ï¸Æ·¾Í»áÌåÑéµ½ÆäµÄ¾«ÇÉÖ®´¦¡£ËµËü±ðŤ£¬ÊÇÒòΪÎÒÃÇÒѾϰ¹ßÁËText=¡°Hello
World¡±ÕâÖÖ¼ü--ֵʽµÄ¸³Öµ·½Ê½£¬¶øÇÒÈÏΪֵÓëÊôÐÔµÄÖµÀàÐÍÒ»¶¨ÒªÒ»ÖÂ-------´óÄԺܿì»áÖÊѯText="{Binding
Value,ElementName=Slider1}"µÄ×ÖÃæÒâ˼----TextµÄÀàÐÍÊÇString£¬ÎªÊ²Ã´Òª¸³Ò»¸öBindingÀàÐ͵ÄֵĨ£¿ÆäʵÎÒÃDz¢²»ÊÇΪTextÊôÐÔ¸³Öµ£¬ÎªÁËÏû³ýÕâÖÖÎó»á£¬ÎÒÃÇ¿ÉÒÔ°Ñ´úÂë¶Á×÷£ºÎªTextÊôÐÔÉèÖÃBindingΪ...¡£ÔÙÏëÉîÒ»²½£¬ÎÒÃDz»ÊǾ³£°Ñº¯ÊýÊÓΪһ¸öÖµÂð£¿Ö»ÊÇÕâ¸öÖµÔÚº¯ÊýÖ´ÐÐÖ®ºó²ÅÄܵõ½¡£Í¬Àí£¬ÎÒÃÇÒ²¿ÉÒÔ°ÑBindingÊÓΪһÖÖ¼ä½ÓµÄ¡¢²»¹Ì¶¨µÄ¸³Öµ·½Ê½-----BindingÀ©Õ¹ºÜÇ¡µ±µÄ±í´ïÁËÕâ¸ö¸³Öµ·½Ê½¡£
1.3.2 ¿ØÖÆBindingµÄ·½Ïò¼°Êý¾Ý¸üÐÂ
BindingÔÚÔ´ÓëÄ¿±êÖ®¼ä¼ÜÆðÁ˹µÍ¨µÄÇÅÁº£¬Ä¬ÈÏÇé¿öÏÂÊý¾Ý¼´¿ÉÒÔͨ¹ýBindingËÍ´ïÄ¿±ê£¬Ò²¿ÉÒÔͨ¹ýÄ¿±ê»Øµ½Ô´(ÊÕ¼¯Óû§¶ÔÊý¾ÝµÄÐÞ¸Ä)¡£ÓÐʱºòÊý¾ÝÖ»ÐèҪչʾ¸øÓû§£¬²»ÐèÒªÓû§Ð޸ģ¬Õâʱºò¿ÉÒÔ°ÑBindingģʽÉèÖÃΪ´ÓÄ¿±êÏòÔ´µÄµ¥Ïò¹µÍ¨ÒÔ¼°Ö»ÔÚBinding¹ØÏµÈ·Á¢Ê±¶Áȡһ´ÎÊý¾Ý£¬ÕâÐèÒªÎÒÃǸù¾Ýʵ¼ÊÇé¿öÑ¡Ôñ¡£
¿ØÖÆBindingÊý¾ÝÁ÷ÏòµÄÊôÐÔÊÇModel£¬ËüµÄÀàÐÍÊÇBindingModelµÄö¾Ù¡£BindingModel¿ÉÒÔȡֵΪTwoWay¡¢OneWay¡¢OneTime¡¢OneWayToSourceºÍDefault¡£ÕâÀïµÄDefaultÖ¸µÄÊÇBindingµÄģʽ»á¸ù¾ÝÄ¿±êÊÇʵ¼ÊÇé¿öÀ´È·¶¨£¬²»ÈçÊÇ¿ÉÒԱ༵ģ¨TextBoxµÄTextÊôÐÔ£©£¬Default¾Í²ÉÓÃË«Ïòģʽ¡£Èç¹ûÊÇTextBlock£¬²»¿É±à¼£¬¾ÍʹÓõ¥Ïòģʽ¡£
½ÓÉÏÒ»½ÚµÄСÀý×Ó£¬Í϶¯SliderÊÖ±úʱ£¬TextBox¾Í»áÏÔʾSliderµÄµ±Ç°Öµ£¨Êµ¼ÊÉÏÕâÒ»¿éÉæ¼°µ½Ò»¸öDoubleµ½StringÀàÐ͵Äת»»£¬ÔÝÇÒºöÂÔ²»¼Æ£©£»Èç¹ûÎÒÃÇÔÚTextBoxÀïÃæÊäÈëÒ»¸öÇ¡µ±µÄÖµ°´Tab¼ü¡¢Èý¹µãÀ뿪TextBox£¬ÔòSliderÊÖ±ú¾Í»áÌø×ªÖÁÏàÓ¦µÄÖµÄÇÀï¡£ÈçÏÂͼËùʾ:

Ϊʲôһ¶¨ÒªÔÚTextBoxʧȥ½¹µãÒÔºó²Å¸Ä±äֵĨ£¿Õâ¾ÍÒý³öÁËBindingµÄÁíÍâÒ»¸öÊôÐÔ-----UpdateSourceTrigger£¬ËüµÄÀàÐÍÊÇUpdateSourceTriggerö¾Ù£¬¿ÉȡֵΪPropertyChanged¡¢LostFous¡¢ExplicitºÍDefault¡£ÏÔÈ»£¬¶ÔÓÚTextµÄDefaultÐÐΪÓëLostFocusÒ»Ö£¬ÎÒÃÇÖ»ÐèÒª°ÑÕâ¸öÖµ¸Ä³ÉPropertyChanged£¬ÔòSlider¾Í»áËæ×ÅÊäÈëÖµµÄ±ä»¯¶ø±ä»¯ÁË¡£
×¢Òâ:
˳±ãÌáÒ»¾ä£¬Binding»¹¾ßÓÐNotifyOnSourceUpdatedÊôÐÔºÍNotifyOnTargetUpdatedÁ½¸öboolÀàÐÍÊÇÊôÐÔ¡£Èç¹ûÉèÖÃΪTrue£¬ÔòÔÚÔ´»òÄ¿±ê±»¸üÐÂÒÔºó¾Í»á´¥·¢ÏàÓ¦µÄSourceUpdatedʼþºÍTargetUpdatedʼþ¡£Êµ¼Ê¹¤×÷ÖÐÎÒÃÇ¿ÉÒÔ¼àÌýÕâÁ½¸öʼþÀ´ÕÒ³öÀ´ÄÄЩÊý¾Ý»ò¿Ø¼þ±»¸üÐÂÁË¡£
1.3.3 BindingµÄ·¾¶(Path)
×öΪBindingµÄÔ´¿ÉÄÜ»áÓкܶàÊôÐÔ£¬Í¨¹ýÕâЩÊôÐÔBindingÔ´¿ÉÒÔ°ÑÊý¾Ý±©Â¶¸øÍâ½ç¡£ÄÇô£¬Bindingµ½µ×ÐèÒª¹Ø×¢ÄĸöÊôÐÔֵĨ£¿¾ÍÐèÒªÓÃBindingµÄPathÊôÐÔÀ´Ö¸¶¨ÁË¡£ÀýÈçÇ°ÃæÕâ¸öÀý×Ó£¬ÎÒÃǰÑSlider¿Ø¼þ¶ÔÏó×÷ΪÊý¾ÝÔ´£¬°ÑËüµÄValueÊôÐÔ×÷Ϊ·¾¶¡£
¾¡¹ÜÔÚXAML´úÂëÖлòÕßBindingÀàµÄ¹¹ÔìÆ÷²ÎÊýÁбíÖÐÎÒÃÇʹÓÃ×Ö·û´®À´±íʾPath£¬µ«PathµÄʵ¼ÊÀàÐÍÊÇPropertyPath¡£ÏÂÃæÈÃÎÒÃÇÀ´¿´¿´ÈçºÎ´´½¨PathÀ´Ó¦¸¶Êµ¼ÊÇé¿ö£¨ÎÒ½«Ê¹ÓÃC#ºÍXAMLÁ½ÖÖ´úÂë½øÐÐÃèÊö£©¡£
×î¼òµ¥µÄ·½·¨¾ÍÊÇÖ±½Ó°ÑBinding¹ØÁªµ½BindingÔ´µÄÊôÐÔÉÏ£¬Ç°ÃæµÄÀý×Ó¾ÍÊÇÕâÑù£¬Óï·¨ÈçÏÂ:
<TextBox Height="23" HorizontalAlignment="Left" Margin="141,46,0,0" Name="textBox1"
VerticalAlignment="Top" Width="120" Text="{Binding Path=Value,ElementName=slider1}"/> |
µÈЧµÄC#´úÂë¾ÍÊÇ£º
this.textBox1.SetBinding(TextBox.TextProperty, new Binding("Value") {Source=slider1}); |
Binding»¹Ö§³Ö¶à¼¶Â·¾¶£¨Í¨Ë׵Ľ²¾ÍÊÇһ·¡°µã¡±ÏÂÈ¥£©£¬±ÈÈ磬ÎÒÃÇÏëÈÃÒ»¸öTextBoxÏÔʾÁíÍâÒ»¸öTextBoxÄÚÈݵij¤¶È£¬ÎÒÃÇ¿ÉÒÔÕâÑùд£º
<TextBox Height="23" HorizontalAlignment="Left" Margin="152,50,0,0"
Name="textBox1" VerticalAlignment="Top" Width="158" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="152,105,0,0"
Name="textBox2"Text="{Binding Path=Text.Length,ElementName=textBox1,Mode=OneWay}"
VerticalAlignment="Top" Width="158"/> |
µÈЧµÄC#´úÂëÊÇ£º
͉˕this.textBox2.SetBinding(TextBox.TextProperty, new Binding("Text.Length")
{Source = textBox1, Mode= BindingMode.OneWay }); |
ÔËÐÐЧ¹ûÈçÏÂͼ:

ÎÒÃÇÖªµÀ£¬¼¯ºÏÀàÐÍÊÇË÷ÒýÆ÷(Indexer)ÓÖ³ÆÎª´ø²ÎÊôÐÔ¡£¼ÈÈ»ÊÇÊôÐÔ£¬Ë÷ÒýÆ÷Ò²ÄÜ×÷ΪPathÀ´Ê¹ÓᣱÈÈçÎÒÃÇÏëÈÃÒ»¸öTextBoxÏÔʾÁíÍâÒ»¸öTextBoxµÄµÚ4¸ö×Ö·û£¬ÎÒÃÇ¿ÉÒÔÕâÑùд£º
<TextBox Height="23" HorizontalAlignment="Left" Margin="152,50,0,0"
Name="textBox1" VerticalAlignment="Top" Width="158" Text="ABCDE" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="152,105,0,0"
Name="textBox2" Text="{Binding Path=Text[3],ElementName=textBox1,
Mode=OneWay}" VerticalAlignment="Top" Width="158"/> |
C#´úÂëÈçÏÂ:
this.textBox2.SetBinding(TextBox.TextProperty, new Binding("Text.[3]")
{ Source=textBox1,Mode= BindingMode.OneWay}); |
ÎÒÃÇÉõÖÁ¿ÉÒÔ°ÑTextÓë[3]Ö®¼äµÄµãÈ¥µô£¬Ò»Ñù¿ÉÒÔÕýÈ·¹¤×÷£¬ÔËÐÐЧ¹ûÈçÏÂͼ:

µ±Ê¹ÓÃÒ»¸ö¼¯ºÏ»òÕßDataView×öΪÊý¾ÝԴʱ£¬Èç¹ûÎÒÃÇÏë°ÑËüĬÈϵÄÔªËØ×öΪÊý¾ÝԴʹÓã¬ÔòÐèҪʹÓÃÏÂÃæµÄÓï·¨:
List<string> infos = new List<string>() { "Jim","Darren","Jacky"}; textBox1.SetBinding(TextBox.TextProperty, new Binding("/") { Source=infos}); textBox2.SetBinding(TextBox.TextProperty, new Binding("/[2]") { Source = infos, Mode= BindingMode.OneWay }); textBox3.SetBinding(TextBox.TextProperty, new Binding("/Length") { Source = infos, Mode= BindingMode.OneWay }); |
ÏÔʾЧ¹ûÈçÏÂ:

Èç¹û¼¯ºÏÖÐÈÔÈ»ÊǼ¯ºÏ,ÎÒÃÇÏë°Ñ×Ó¼¯¼¯ºÏÖеÄÔªËØ×öPath£¬ÎÒÃÇ¿ÉÒÔʹÓö༶бÏßµÄÓï·¨£¨¼´¡°Ò»Â·¡±Ð±ÏßÏÂÈ¥£©£¬ÀýÈç:
/// <summary> /// Window4.xaml µÄ½»»¥Âß¼ /// </summary> public partial class Window4 : Window { public Window4() { InitializeComponent(); List<Contry> infos = new List<Contry>() { new Contry() { Name = "Öйú",
Provinces= new List<Province>(){ new Province(){ Name="ËÄ´¨",Citys=new List<City>(){new City(){Name="ÃàÑôÊÐ" }}}}}}; this.textBox1.SetBinding(TextBox.TextProperty, new Binding("/Name") { Source=infos}); this.textBox2.SetBinding(TextBox.TextProperty, new Binding("/Provinces/Name") { Source = infos }); this.textBox3.SetBinding(TextBox.TextProperty, new Binding("/Provinces/Citys/Name") { Source = infos }); } } class City { public string Name { set; get; } } class Province { public string Name { set; get; } public List<City> Citys { set; get; } } class Contry { public string Name { set; get; } public List<Province> Provinces { get; set; } } |
ÔËÐÐЧ¹ûÈçͼ:

1.3.4 "ûÓÐPath"µÄBinding
ÓеÄʱºòÎÒÃÇ»áÔÚ´úÂëÖÐÎÒÃÇ¿´´óPathÊÇÒ»¸ö¡°.¡±»òÕ߸ɴàûÓÐPathµÄBinding£¬×ÅʵÈÃÈËÃþ²»×ÅÍ·ÄÔ¡£ÔÀ´ÕâÊÇÒ»ÖֱȽÏÌØÊâµÄÇé¿ö---BindingÔ´±¾Éí¾ÍÊÇÒ»ÖÖÊý¾ÝÇÒ²»ÐèÒªPathÀ´Ö¸Ã÷¡£µäÐ͵Ästring,intµÈ»ù±¾ÀàÐͶ¼ÊÇÕâÑù£¬ËûÃÇÊÇʵÀý±¾Éí¾ÍÊÇÊý¾Ý£¬ÎÒÃÇÎÞ·¨Ö¸¶¨Í¨¹ýÄǸöÊôÐÔÀ´·ÃÎÊÕâ¸öÊý¾Ý£¬ÕâÊÇÎÒÃÇÖ»ÐèÒª½«Õâ¸öÊý¾ÝÉèÖÃΪ.¾Í¿ÉÒÔÁË¡£ÔÚXAMLÖÐÕâ¸ö.¿ÉÒÔºöÂÔ²»Ð´£¬µ«ÊÇÔÚC#Öбà³Ì±ØÐëÒª´øÉÏ¡£ÏÂÃæÇë¿´ÏÂÃæÕâ¶Î´úÂë:
<Window x:Class="WpfApplication1.Window5" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:String="clr-namespace:System;assembly=mscorlib" Title="Window5" Height="331" Width="538"> <StackPanel Height="184" Name="stackPanel1" Width="288"> <StackPanel.Resources> <String:String x:Key="myString"> ÆÐÌá±¾ÎÞÊ÷£¬ºÎ´¦È¾³¾°£¡£ </String:String> </StackPanel.Resources> <TextBlock Height="23" Name="textBlock1"
Text="{Binding Path=.,Source={StaticResource ResourceKey=myString}}" /> </StackPanel> </Window> |
ÉÏÃæµÄ´úÂë¿ÉÒÔ¼òд³É:
<TextBlock Height="23" Name="textBlock1" Text="{Binding .,Source={StaticResource ResourceKey=myString}}" /> |
»òÕßÖ±½Óд³É:
<TextBlock Height="23" Name="textBlock1" Text="{Binding Source={StaticResource ResourceKey=myString}}" /> |
×¢Òâ:
×îºóÕâÖÖ¼òдºÜÈÝÒ×±»Îó½âΪûÓÐÖ¸¶¨Path£¬ÆäʵֻÊÇÊ¡ÂÔµôÁË¡£ÓëÖ»µÈЧµÄC#´úÂëÈçÏÂ:
string myString = "ÆÐÌá±¾ÎÞÊ÷£¬Ã÷¾µÒàÎÞ̨¡£±¾À´ÎÞÒ»ÎºÎ´¦È¾³¾°£¡£"; this.textBlock1.SetBinding(TextBlock.TextProperty, new Binding(".") { Source=myString}); |
×¢Ò⣺
×îºó˳±ã´øÒ»¾ä£¬PropertyPath³ýÁËÓÃÓÚBindingµÄPathÊôÐÔÖ®Í⣬ÔÚ¶¯»±à³ÌµÄʱºòÒ²»áÅÉÉÏÓ󡣨Storyboard.TargetProperty£©¡£ÔÚÓÃÓÚ¶¯»±à³ÌµÄʱºò£¬PropertyPath»¹ÓÐÁíÍâÒ»ÖÖÓï·¨£¬µ½Ê±ºòÎÒÃÇϸ˵¡£
1.3.5 °ÑBindingÖ¸¶¨ÎªÔ´(Source)µÄ¼¸ÖÖ·½·¨
ÉÏÒ»½ÚÎÒÃÇѧϰÁËÈçºÎͨ¹ýBindingµÄpathÊôÐÔÈçºÎÔÚÒ»¸ö¶ÔÏóÉÏѰÕÒÊý¾Ý¡£ÕâÒ»½ÚÎÒÃǽ«Ñ§Ï°ÈçºÎΪBindingÖ¸¶¨Ô´£¨Source£©¡£
BindingµÄÔ´ÊÇÊý¾ÝµÄÀ´Ô´£¬ËùÒÔ£¬Ö»ÒªÒ»¸ö¶ÔÏó°üº¬Êý¾Ý²¢ÇÒÄܹ»Í¨¹ýÊôÐÔ½«Êý¾Ý±©Â¶³öÀ´£¬Ëü¾ÍÄܵ±×÷BindingµÄÔ´À´Ê¹Óᣰüº¬Êý¾ÝµÄ¶ÔÏó±È±È½ÔÊÇ£¬µ«±ØÐëΪBindingµÄSourceÖ¸¶¨ºÏÊʵĶÔÏóBinding²ÅÄÜÕý³£¹¤×÷£¬³£Óõİ취ÓÐ:
°ÑÆÕͨµÄCLRµ¥¸ö¶ÔÏóÖ¸¶¨ÎªSource£º°üÀ¨.NetFrameWork×Ô´øÀàÐ͵ĶÔÏóºÍÓû§×Ô¶¨ÒåÀàÐ͵ĶÔÏó¡£Èç¹ûÀàÐÍʵÏÖÁËINotifyPropertyChanged½Ó¿Ú£¬Õâ¿ÉÒÔͨ¹ýÔÚÊôÐÔµÄSetÓï¾äÀD·¢PropertyChangedʼþÀ´Í¨ÖªBindingÒѾ¸üС£
°ÑÆÕͨµÄCLR¶ÔÏ󼯺ÏÖ¸¶¨ÎªSource£º°üÀ¨Êý×é,List<T>,ObservableCollection<T>µÈ¼¯ºÏÀàÐÍ¡£Êµ¼Ê¹¤×÷ÖУ¬ÎÒÃǾ³£ÐèÒª½«Ò»¸ö¼¯ºÏÀàÐÍ×÷ΪItemControlµÄÅÉÉúÀàµÄÊý¾ÝÀ´Ê¹Óã¬Ò»°ã°Ñ¿Ø¼þItemSourceÊôÐÔʹÓÃBinding¹ØÁªµ½Ò»¸ö¼¯ºÏ¶ÔÏóÉÏ¡£
°ÑADO.NETÊý¾ÝÖ¸¶¨ÎªSource£º°üÀ¨DataTableºÍDataView¶ÔÏó¡£
ʹÓÃXmlDataProvider°ÑXMLÊý¾ÝÖ¸¶¨ÎªSource:XML×öΪ±ê×¼µÄÊý¾Ý´«ÊäºÍ´æ´¢¸ñʽ£¬¼¸ºõÎÞ´¦²»ÔÚ£¬ÎÒÃÇ¿ÉÒÔÓÃËü±íʾµ¥¸ö¶ÔÏó»òÕß¼¯ºÏ¶ÔÏó£»Ò»Ð©WPF¿Ø¼þÊǼ¶ÁªµÄ£¨ÈçTreeviewºÍMenu£©£¬ÎÒÃÇ¿ÉÒÔ°ÑÊ÷×´½á¹¹µÄXMLÊý¾Ý×÷ΪԴָ¶¨¸øÓëÖ®¹ØÁªµÄBinding¡£
°ÑÒÀÀµ¶ÔÏó(Dependency Object)Ö¸¶¨ÎªSource£ºÒÀÀµ¶ÔÏó²»½ö¿ÉÒÔ×öΪBinding
µÄÄ¿±ê£¬»¹ÄÜ×÷ΪBinding µÄÔ´¡£ÕâÑù¾ÍÓпÉÄÜÐγÉBindingÁ´¡£ÒÀÀµ¶ÔÏóÖеÄÒÀÀµÊôÐÔ¿ÉÒÔ×öΪBindingµÄPath¡£
°ÑÈÝÆ÷µÄDataContextÖ¸¶¨ÎªSource£¨WPF ÖÐBindingµÄĬÈÏÐÐΪ£©£ºÓÐʱºòÎÒÃÇ»áÓöµ½ÕâÑùÒ»ÖÖÇé¿ö----ÎÒÃÇÃ÷È·ÖªµÀ½«´ÓÄǸöÊôÐÔ»ñÈ¡Êý¾Ý£¬µ«¾ßÌåʹÓÃÄĸö¶ÔÏó×÷ΪBindingµÄÔ´»¹²»È·¶¨¡£ÕâʱºòÎÒÃÇÖ»ÐèÒªÏȽ¨Á¢Ò»¸öBinding£¬Ö»¸øËüÉèÖÃPath¶ø²»ÉèÖÃSource£¬ÈÃÕâ¸öBinding×Ô¼ºÈ¥Ñ°ÕÒÔ´£¬Õâʱºò£¬Binding»á×Ô¶¯°Ñ¿Ø¼þµÄDataContext×÷Ϊµ±×÷×Ô¼ºµÄSource£¨Ëü»áÑØ×ſؼþÊ÷Ò»Ö±ÏòÍâÕÒ£¬Ö±µ½ÕÒµ½´øÓÐPathÖ¸¶¨µÄ¶ÔÏóΪֹ£©¡£
ͨ¹ýElementNameÖ¸¶¨Source£ºÔÚC#´úÂëÖпÉÒÔÖ±½Ó°Ñ¶ÔÏó×÷ΪSource¸³Öµ¸øBinding£¬µ«ÊÇXAMLÎÞ·¨·ÃÎʶÔÏó£¬Ö»ÄÜʹÓÃNameÊôÐÔÀ´ÕÒµ½¶ÔÏó¡£
ͨ¹ýBindingµÄRelataveSourceÊôÐÔÏà¶ÔµÄÖ¸¶¨Source£ºµ±¿Ø¼þÐèÒª¹Ø×¢×Ô¼ºµÄ¡¢×Ô¼ºÈÝÆ÷µÄ»òÕß×Ô¼ºÄÚ²¿Ä³¸öÊôÐÔÖµ¾ÍÐèҪʹÓÃÕâÖÖ°ì·¨¡£
°ÑObjectDataProviderÖ¸¶¨ÎªSource£ºµ±Êý¾ÝÔ´µÄÊý¾Ý²»ÊÇͨ¹ýÊôÐÔ£¬¶øÊÇͨ¹ý·½·¨±©Â¶¸øÍâ½çµÄʱºò£¬ÎÒÃÇ¿ÉÒÔʹÓÃÕâÖÖ¶ÔÏóÀ´°ü×°Êý¾ÝÔ´ÔÙ°ÑËüÃÇÖ¸¶¨ÎªSource¡£
°ÑʹÓÃLINQ¼ìË÷µ½µÄÊý¾Ý×÷ΪÊý¾ÝÔ´¡£
ÏÂÃæÎÒÃÇʹÓÃʵÀýÀ´·Ö±ðÃèÊöÿÖÖÇé¿ö£º
1.3.6 ûÓÐSourceµÄBinding----ʹÓÃDataContext×÷ΪÊý¾ÝÔ´
Ç°ÃæµÄÀý×Ó¶¼Êǰѵ¥¸öµÄCLR¶ÔÏó×÷ΪBinding µÄÔ´£¬·½·¨ÓÐÁ½ÖÖ£º°Ñ¶ÔÏó¸³Öµ¸øBinding.SourceÊôÐÔ»òÕ߰ѶÔÏóµÄName¸³Öµ¸øBinding.ElementName¡£DataContext±»¶¨ÒåÔÚFrameWorkElementÀàÖУ¬Õâ¸öÀàÊÇWPF¿Ø¼þµÄ»ùÀ࣬ÕâÒâζ×ÅËùÓеÄWPF¿Ø¼þ°üÀ¨²¼¾Ö¿Ø¼þ¶¼°üº¬Õâ¸öÊôÐÔ¡£ÈçǰËùÊö£¬WPFµÄUI²¼¾ÖÊÇÊ÷Ðνṹ£¬Õâ¸öÊ÷µÄÿ¸ö½Úµã¶¼Êǿؼþ£¬ÓÉ´ËÎÒÃÇÍÆ³öÒ»¸ö½áÂÛ----ÔÚUIÊ÷µÄÿ¸ö½Úµã¶¼ÓÐDataContextÊôÐÔ¡£ÕâÒ»µã·Ç³£ÖØÒª£¬ÒòΪµ±Ò»¸öBindingÖ»ÖªµÀ×Ô¼ºµÄPath¶ø²»ÖªµÀ×Ô¼ºµÄÔ´µÄʱºò£¬Ëü»áÑØ×ÅÊ÷µÄһ·ÏòÊ÷µÄ¸ù²¿ÕÒ¹ýÈ¥£¬Ã¿¾¹ýÒ»¸ö½Úµã¶¼Òª²é¿´Õâ¸ö½ÚµãµÄDataContextÊôÐÔÊÇ·ñ¾ßÓÐPathËùÖ¸¶¨µÄÊôÐÔ¡£Èç¹ûÓУ¬¾Í°ÑÕâ¸ö¶ÔÏó×÷Ϊ×Ô¼ºµÄSource£»Èç¹ûûÓУ¬¾Í¼ÌÐøÕÒÏÂÈ¥£»Èç¹ûµ½Ê÷µÄ¸ù²¿»¹Ã»ÓÐÕÒµ½£¬ÄÇÕâ¸öBinding¾ÍûÓÐSource£¬Òò¶øÒ²²»»áµÃµ½Êý¾Ý£¬ÈÃÎÒÃÇ¿´¿´ÏÂÃæµÄÀý×Ó:
ÏÈ´´½¨Ò»¸öÃûΪStudentµÄÀ࣬Ëü¾ßÓÐID,Name,Age3¸öÊôÐÔ£º
public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } |
ÔÚºóÔÚXAMLÖн¨Á¢UI½çÃæ:
<Window x:Class="WpfApplication1.Window6" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Stu="clr-namespace:WpfApplication1" Title="Window6" Height="345" Width="464"> <StackPanel Background="AliceBlue"> <StackPanel.DataContext> <Stu:Student Id="1" Name="Darren" Age="10"></Stu:Student> </StackPanel.DataContext> <Grid> <StackPanel Height="283" HorizontalAlignment="Left" Margin="12,12,0,0"
Name="stackPanel1" VerticalAlignment="Top" Width="418"> <TextBox Height="23" Name="textBox1" Width="120" Margin="15" Text="{Binding Path=Id}"/> <TextBox Height="23" Name="textBox2" Width="120" Margin="15" Text="{Binding Path=Name}"/> <TextBox Height="23" Name="textBox3" Width="120" Margin="15" Text="{Binding Path=Age}"/> </StackPanel> </Grid> </StackPanel> </Window> |
Õâ¸öUI¿ÉÒÔÓÃÈçϵÄÖù״ͼÀ´±íʾ:

ʹÓÃxmlns:Stu="clr-namespace:WpfApplication1"£¬ÎÒÃǾͿÉÒÔÔÚXAMLÖÐʹÓÃÔÚC#Öж¨ÒåµÄÀࡣʹÓÃÁËÕ⼸ÐдúÂë:
<StackPanel.DataContext> <Stu:Student Id="1" Name="Darren" Age="10"></Stu:Student> </StackPanel.DataContext> |
¾ÍΪÍâ²ãStackPanelµÄDataContext½øÐÐÁ˸³Öµ----ËüÊÇÒ»¸öStudent¶ÔÏó¡£3¸öTextBoxͨ¹ýBinding»ñȡֵ£¬µ«Ö»ÎªBindingÖ¸¶¨ÁËPath£¬Ã»ÓÐÖ¸¶¨Source¡£¼òд³ÉÕâÑùÒ²¿ÉÒÔ£º
<TextBox Height="23" Name="textBox1" Width="120" Margin="15" Text="{Binding Id}"/> <TextBox Height="23" Name="textBox2" Width="120" Margin="15" Text="{Binding Name}"/> <TextBox Height="23" Name="textBox3" Width="120" Margin="15" Text="{Binding Age}"/> |
ÕâÑù3¸öTextBox¾Í»áÑØ×ÅÊ÷ÏòÉÏѰÕÒ¿ÉÓõÄDataContext¶ÔÏó¡£ÔËÐÐЧ¹ûÈçÏÂͼ:

Ç°ÃæÔÚѧϰBinding·¾¶µÄʱºò£¬µ±BindingµÄSource±¾Éí¾ÍÊÇÊý¾Ý¡¢²»ÐèҪʹÓÃÊôÐÔÀ´±©Â¶Êý¾Ýʱ£¬BindingµÄPath¿ÉÒÔÉèÖÃΪ"."£¬Òà¿ÉÊ¡ÂÔ²»Ð´¡£ÏÖÔÚSourceÒ²¿ÉÒÔÊ¡ÂÔ²»Ð´ÁË£¬ÕâÑù£¬µ±Ä³¸öDataContextΪ¼òµ¥ÀàÐͶÔÏóµÄʱºò£¬ÎÒÃÇÍêÈ«¿ÉÄÜ¿´µ½Ò»¸ö¼ÈûÓÐPath£¬ÓÖûÓÐSourceµÄBinding£º
<Window x:Class="WpfApplication1.Window7" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Str="clr-namespace:System;assembly=mscorlib" Title="Window7" Height="300" Width="300"> <Grid> <Grid.DataContext> <Str:String>Hello DataContext</Str:String> </Grid.DataContext> <StackPanel> <TextBlock Height="23" HorizontalAlignment="Left" Margin="15"
Name="textBlock1" Text="{Binding}" VerticalAlignment="Top" /> <TextBlock Height="23" HorizontalAlignment="Left" Margin="15"
Name="textBlock2" Text="{Binding}" VerticalAlignment="Top" /> <TextBlock Height="23" HorizontalAlignment="Left" Margin="15"
Name="textBlock3" Text="{Binding}" VerticalAlignment="Top" /> </StackPanel> </Grid> </Window> |
ÔËÐÐЧ¹ûÈçÏÂͼ:

Äã¿ÉÄÜ»ØÏ룬BindingÔõô»á×Ô¶¯ÏòUIÔªËØÉÏÒ»²ã²éÕÒDataContext²¢°ÑËü×÷Ϊ×Ô¼ºµÄSourceÄØ£¿Æäʵ£¬¡°BindingÑØ×ÅUIÔªËØÊ÷ÏòÉÏÕÒ¡±Ö»ÊÇWPF¸øÎÒÃǵÄÒ»¸ö´í¾õ£¬Binding²¢Ã»ÓÐÄÇôÖÇÄÜ¡£Ö®ËùÒÔ»áÕâÑùÊÇÒòΪDataContextÊÇÒ»¸ö¡°ÒÀÀµÊôÐÔ¡±£¬ºóÃæµÄÕ½ÚÎÒÃÇ»áÏêϸÃèÊö£¬ÒÀÀµÊôÐÔÓÐÒ»¸öºÜÃ÷ÏÔµÄÌØµã¾ÍÊÇÄãûÓÐΪij¸ö¿Ø¼þµÄÒÀÀµÊôÐÔ¸³ÖµµÄʱºò£¬¿Ø¼þ»á°Ñ×Ô¼ºÈÝÆ÷µÄÊôÐÔÖµ½Ó¹ýÀ´µ±×÷×Ô¼ºµÄÊôÐÔÖµ¡£Êµ¼ÊÉÏÊôÐÔÖµÊÇÑØ×ÅUIÔªËØÊ÷ÏòÏ´«µÝµÄ¡£
ÔÚʵ¼Ê¹¤×÷ÖУ¬DataContextÊôÐÔÖµµÄÔËÓ÷dz£µÄÁé»î¡£±ÈÈç:
µ±UIÉϵĶà¸ö¿Ø¼þ¶¼Ê¹ÓÃBinding¹Ø×¢Í¬Ò»¸ö¶ÔÏó±ä»¯µÄʱºò£¬²»·ÁʹÓÃDataContext¡£
µ±×÷ΪSourceµÄ¶ÔÏó²»Äܱ»Ö±½Ó·ÃÎʵÄʱºò----±ÈÈçB´°ÌåÄڵĿؼþÏë°ÑA´°ÌåÀïµÄ¿Ø¼þµ±×÷×Ô¼ºµÄBindingԴʱ£¬µ«ÊÇA´°ÌåÄڵĿؼþ¿É·ÃÎʼ¶±ðÊÇprivateÀàÐÍ£¬ÕâÊǾͿÉÒÔ°ÑÕâ¸ö¿Ø¼þ»òÕ߿ؼþÖµ×÷Ϊ´°ÌåAµÄDataContext£¨Õâ¸öÊôÐÔÊÇPublic¼¶±ðµÄ£©ÕâÑù¾Í¿ÉÒÔ±©Â¶Êý¾ÝÁË¡£
ÐÎÏóµÄ˵£¬ÕâʱºòÍâ²ãµÄÊý¾Ý¾ÍÏ൱ÓÚÒ»¸öÊý¾ÝµÄ¡°ÖÁ¸ßµã¡±£¬Ö»Òª°ÑÔªËØ·ÅÉÏÈ¥£¬±ðÈ˾ÍÄܹ»¿´¼û¡£ÁíÍâDataContext±¾Éí¾ÍÊÇÒ»¸öÒÀÀµÊôÐÔ£¬ÎÒÃÇ¿ÉÒÔʹÓÃBinding°ÑËü¹ØÁªµ½Ò»¸öÊý¾ÝÔ´ÉÏ¡£
1.3.7 ʹÓü¯ºÏ¶ÔÏó×÷ΪÁÐ±í¿Ø¼þµÄItemsSource
ÓÐÁËDataContext×÷Ϊ»ù´¡£¬ÎÒÃÇÔÙÀ´¿´¿´°Ñ¼¯ºÏÀàÐͶÔÏó×÷ΪBindingÔ´µÄÇé¿ö¡£
WPFÖеÄÁбíʽ¿Ø¼þ¶¼ÅÉÉú×ÔItemControlÀ࣬×ÔȻҲ¼Ì³ÐÁËItemSourceÕâ¸öÊôÐÔ¡£ItemSource¿ÉÒÔ½ÓÊÕÒ»¸öIEnumerable½Ó¿ÚÅÉÉúÀàµÄʵÀý×÷Ϊ×Ô¼ºµÄÖµ£¨ËùÓпɱ»µü´ú±éÀúµÄ¼¯ºÏ¶¼ÊµÏÖÁËÕâ¸ö½Ó¿Ú£¬°üÀ¨Êý×é¡¢List<T>µÈ£©¡£Ã¿¸öItemControl¶¼¾ßÓÐ×Ô¼ºµÄÌõÄ¿ÈÝÆ÷Item
Container£¬ÀýÈ磬ListBoxµÄÌõÄ¿ÈÝÆ÷ÊÇListBoxItem¡¢ComboxµÄÌõÄ¿ÈÝÆ÷ÊÇComboxItem¡£ItemSourceÀïÃæ±£´æµÄÊÇÒ»ÌõÒ»ÌõµÄÊý¾Ý£¬ÏëÒª°ÑÊý¾ÝÏÔʾ³öÀ´¾ÍҪΪÊý¾Ý´©ÉÏÍâÒ£¬ÌõÄ¿ÈÝÆ÷¾ÍÆðµ½ÁËÊý¾ÝÍâÒµÄ×÷Óá£ÕâÑù½«Êý¾ÝÍâÒºÍËüËù¶ÔÓ¦µÄÌõÄ¿ÈÝÆ÷¹ØÁªÆðÀ´ÄØ£¿µ±È»Ê±ÒÀ¿¿Binding£¡Ö»ÒªÎÒÃÇΪһ¸öItemControlÉèÖÃÁËItemSourceÊôÐÔÖµ£¬ItemControl»á×Ô¶¯µü´úÆäÖеÄÊý¾ÝÔªËØ£¬ÎªÃ¿¸öÊý¾ÝÔªËØ×¼±¸Ò»¸öÌõÄ¿ÈÝÆ÷£¬²¢Ê¹ÓÃBindingÔªËØÔÚÌõÄ¿ÈÝÆ÷ºÍÊý¾ÝÔªËØÖ®¼ä½¨Á¢Æð¹ØÁª£¬ÈÃÎÒÃÇÀ´¿´Ò»¸öÀý×Ó£º
UI´úÂëÈçÏ£º
<Window x:Class="WpfApplication1.Window8" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window8" Height="356" Width="471"> <Grid> <StackPanel Height="295" HorizontalAlignment="Left" Margin="10,10,0,0"
Name="stackPanel1" VerticalAlignment="Top" Width="427"> <TextBlock Height="23" Name="textBlock1" Text="ѧԱ±àºÅ:" /> <TextBox Height="23" Name="txtStudentId" Width="301" HorizontalAlignment="Left"/> <TextBlock Height="23" Name="textBlock2" Text="ѧԱÁбí:" /> <ListBox Height="208" Name="lbStudent" Width="305" HorizontalAlignment="Left"/> </StackPanel> </Grid> </Window> |
´°ÌåÔËÐÐЧ¹ûÈçÏÂͼ:

ÎÒÃÇҪʵÏÖµÄЧ¹û¾ÍÊǰÑList<Student>µÄ¼¯ºÏ×÷ΪListBoxµÄItemSource,ÈÃListBoxÏÔʾѧԱµÄName,²¢Ê¹ÓÃTextBoxÏÔʾµ±Ç°Ñ¡ÖÐѧԱµÄId,ΪÁËʵÏÖÕâ¸ö¹¦ÄÜ,ÎÒÃÇÐèÒªÔÚ´°ÌåµÄ¹¹Ô캯ÊýÖÐÌí¼Ó¼¸ÐдúÂë:
List<Student> infos = new List<Student>() { new Student(){ Id=1, Age=11, Name="Tom"}, new Student(){ Id=2, Age=12, Name="Darren"}, new Student(){ Id=3, Age=13, Name="Jacky"}, new Student(){ Id=4, Age=14, Name="Andy"} }; this.lbStudent.ItemsSource = infos; this.lbStudent.DisplayMemberPath = "Name"; this.txtStudentId.SetBinding(TextBox.TextProperty,new Binding("SelectedItem.Id"){ Source=lbStudent}); |
ÔËÐнá¹ûÈçÏÂͼ£º

Äã¿ÉÄÜ»ØÏ룬Õâ¸öÀý×ÓÖв¢Ã»ÓгöÏÖ¸Õ²ÅÎÒÃÇ˵µÄBinding¡£Êµ¼ÊÉÏ£¬ this.lbStudent.DisplayMemberPath
= "Name";Õâµã´úÂë¶³öÁËÒ»µãÖëË¿Âí¼£¡£×¢Òâµ½°üº¬PathÕâ¸öµ¥´ÊÁËÂð£¿Õâ˵Ã÷ËüÊÇÒ»¸ö·¾¶¡£µ±DisplayMemberPath
±»¸³ÖµÒÔºó£¬ListBoxÔÚ»ñµÃItemSourceµÄʱºò¾Í»á´´½¨Ò»¸öµÈÁ¿µÄListBoxItem²¢ÒÔDisplayMemberPathµÄֵΪPath´´½¨Binding£¬BindingµÄÄ¿±êÊÇListBoxItemµÄÄÚÈݲå¼þ£¨Êµ¼ÊÉÏÊÇÒ»¸öTextBox£¬ÏÂÃæ¾Í»á¿´¼û£©¡£
Èç¹ýÔÚItemControlÀàµÄ´úÂëÀïÅÙ¸ùÎʵף¬Äã»á·¢ÏÖBindingµÄ¹ý³ÌÊÇÔÚDisplayMemberTemplateSelectorÀàµÄSelectTemplate·½·¨ÀïÍê³ÉµÄ¡£Õâ¸ö·½·¨µÄ¶¨Òå¸ñʽÈçÏÂ:
public override DataTemplate SelectTemplate(object item, DependencyObject container) { //Âß¼´úÂë } |
ÕâÀïÎÒÃǵ¹²»±Ø¹ØÐÄËüµÄʵ¼ÊÄÚÈÝ£¬×¢Òâµ½ËüµÄ·µ»ØÖµÃ»ÓУ¬ÊÇÒ»¸öDataTemplateÀàÐ͵ÄÖµ¡£Êý¾ÝµÄÍâÒ¾ÍÊÇÓÉDataTemplate´©Éϵ졵±ÎÒÃÇûÓÐΪItemControlÏÔʾµÄÖ¸¶¨TemplateµÄʱºòSelectTemplate»áĬÈϵÄΪÎÒÃÇ´´½¨Ò»¸ö×î¼òµ¥µÄDataTemplate----¾ÍºÃÏñ¸øÊý¾Ý´©ÉÏÁËÒ»¸ö¼òµ¥µÄÒ·þÒ»Ñù¡£ÖÁÓÚʲôÊÇTemplateÒÔ¼°Õâ¸ö·½·¨µÄÍêÕû´úÂ뽫»á·Åµ½ÓëTemplateÏà¹ØµÄÎÄÕÂÖÐ×ÐϸȥÌÖÂÛ¡£ÕâÀïÎÒÃÇÖ»¹ØÐÄSelectTemplateÄÚ²¿´´½¨Binding
µÄ¼¸Ðйؼü´úÂë:
FrameworkElementFactory text = ContentPresenter.CreateTextBlockFactory(); Binding bind = new Binding(); bind.Path = new PropertyPath(_displayMemberPath); bind.StringFormat = _stringFormat; text.SetBinding(TextBlock.TextProperty,bind); |
×¢Ò⣺
ÕâÀï¶Ôд´½¨µÄBindingÉ趨ÁËPath¶øÃ»ÓÐÖ¸¶¨Source£¬½ô½ÓÕâ¾Í°ÑËü¹ØÁªµ½ÁËTextBlockÉÏ¡£ÏÔÈ»£¬ÒªÏëµÃµ½Source£¬Õâ¸öBindingÐèÒªÏòÊ÷¸ù·½ÏòѰÕÒ°üº¬_displayMemberPathÖ¸¶¨ÊôÐÔµÄDataContext¡£
×îºóÎÒÃÇÔÙ¿´Ò»¸öÏÔʾΪÊý¾ÝÉèÖÃDataTemplateµÄÀý×Ó£¬ÏȰÑC#´úÂëÖеÄthis.lbStudent.DisplayMemberPath
= "Name";Ò»¾äɾ³ý£¬ÔÙÔÚXAML´úÂëÖÐÌí¼Ó¼¸ÐдúÂ룬ListBoxµÄItemTemplateÊôÐÔ£¨¼Ì³Ð×ÔItemControlÀࣩµÄÀàÐÍÊÇDataTemplate£¬ÏÂÃæÎÒÃǾÍΪStudentÀàÐÍʵÀýÁ¿Éí¶¨×ö¡°Ò·þ¡±¡£
<Window x:Class="WpfApplication1.Window8" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window8" Height="356" Width="471"> <Grid> <StackPanel Height="295" HorizontalAlignment="Left" Margin="10,10,0,0"
Name="stackPanel1" VerticalAlignment="Top" Width="427"> <TextBlock Height="23" Name="textBlock1" Text="ѧԱ±àºÅ:" /> <TextBox Height="23" Name="txtStudentId" Width="301" HorizontalAlignment="Left"/> <TextBlock Height="23" Name="textBlock2" Text="ѧԱÁбí:" /> <ListBox Height="208" Name="lbStudent" Width="305" HorizontalAlignment="Left"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Name="stackPanel2" Orientation="Horizontal"> <TextBlock Text="{Binding Id}" Margin="5" Background="Beige"/> <TextBlock Text="{Binding Name}" Margin="5"/> <TextBlock Text="{Binding Age}" Margin="5"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> </Grid> </Window> |
ÔËÐÐЧ¹ûͼ:

×îºóÌØ±ðÌáÐÑ´ó¼ÒÒ»µã:
ÔÚʹÓü¯ºÏÀàÐ͵ÄÊý¾Ý×÷ΪÁÐ±í¿Ø¼þµÄItemSourceʱһ°ã»á¿¼ÂÇʹÓÃObservableCollection<T>Ìæ»»List<T>£¬ÒòΪObservableCollection<T>ÀàʵÏÖÁËINotifyChangeºÍINotifyPropertyChanged½Ó¿Ú£¬ÄܰѼ¯ºÏµÄ±ä»¯Á¢¿Ì֪ͨÏÔʾµ½ËüµÄÁÐ±í¿Ø¼þÉÏ£¬¸Ä±ä»áÁ¢¿ÌÏÔʾ³öÀ´¡£
1.3.8 ʹÓÃADO.NET¶ÔÏó×÷ΪBindingµÄÔ´
ÔÚ.Net¿ª·¢¹¤×÷ÖУ¬ÎÒÃÇÓÃADO.NETÀà¶ÔÊý¾Ý¿â½øÐвÙ×÷¡£³£¼ûµÄ¹¤×÷¾ÍÊÇ´ÓÊý¾Ý¿âÖжÁÈ¡Êý¾Ýµ½DataTableÖУ¬ÔÚ°ÑDataTableÀïµÄÊý¾Ý°ó¶¨µÄUIµÄ¿Ø¼þÀïÃæ£¨Èç³É¼¨µ¥¡¢²©¿ÍÁÐ±í£©¡£¾¡¹ÜÔÚÁ÷ÐеÄÈí¼þ¼Ü¹¹Öв¢²»°ÑDataTableÖеÄÊý¾ÝÖ±½ÓÏÔʾÔÚUIÁÐ±í¿Ø¼þÀïÃæ¶øÊÇÏÈͨ¹ýLINQµÈÊֶΰÑDataTableÀïµÄÊý¾Ýת»»³ÉÇ¡µ±µÄÓû§×Ô¶¨ÒåÀàÐͼ¯ºÏ£¬µ«WPFÒ²Ö§³ÖDataTableÒ²Ö§³ÖÔÚÁÐ±í¿Ø¼þºÍDataTableÀïÖ±½Ó½¨Á¢Binding¡£
ÏÖÔÚÎÒÃÇ×öÒ»¸öʵÀýÀ´½²½âÈçºÎÔÚDataTableºÍUI½¨Á¢Binding£º
¶àÊýÇé¿öÏÂÎÒÃÇ»áÓÃListView¿Ø¼þÀ´ÏÔʾһ¸öDataTable£¬XAML´úÂëÈçÏÂ:
<Window x:Class="WpfApplication1.Window9" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window9" Height="345" Width="482"> <StackPanel Height="279" Name="stackPanel1" Width="431"> <ListView Height="247" Name="listView1" Width="376"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="60"> </GridViewColumn> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="60"> </GridViewColumn> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="60"> </GridViewColumn> <GridViewColumn Header="Sex" DisplayMemberBinding="{Binding Sex}" Width="60"> </GridViewColumn> </GridView> </ListView.View> </ListView> </StackPanel> </Window> |
ÕâÀïÎÒÃÇÓм¸µãÐèҪעÒâµÄµØ·½:
´Ó×ÖÃæÉÏÀ´Àí½â£¬ListViewºÍGridViewÓ¦¸ÃÊôÓÚͬһ¼¶±ðµÄ¿Ø¼þ£¬Êµ¼ÊÉÏÔ¶·ÇÕâÑù£¡ListViewÊÇListBoxµÄÅÉÉúÀà¶øGridViewÊÇViewBaseµÄÅÉÉúÀ࣬ListViewÖеÄViewÊÇÒ»¸öViewBase¶ÔÏó£¬ËùÒÔ£¬GridView¿ÉÒÔ×öΪListViewµÄViewÀ´Ê¹Óöø²»Äܵ±×÷¶ÀÁ¢µÄ¿Ø¼þÀ´Ê¹Óá£ÕâÀïʹÓÃÀíÄîÊÇ×éºÏģʽ£¬¼´ListViewÓÐÒ»¸öView£¬µ«ÊÇÖÁÓÚÊÇGridView»¹ÊÇÆäËüÀàÐ͵ÄView£¬ÓɳÌÐòÔ±×Ô¼ºÑ¡Ôñ----ĿǰֻÓÐÒ»¸öGridView¿ÉÓ㬹À¼ÆÎ¢ÈíÔÚÕâÀﻹ»áÓÐÀ©Õ¹¡£Æä´Î£¬GridViewµÄÄÚÈÝÊôÐÔÊÇColumns£¬Õâ¸öÊôÐÔÊÇGridViewColumnCollectionÀàÐͶÔÏó¡£ÒòΪXAMLÖ§³Ö¶ÔÄÚÈÝÊôÐԵļòд£¬¿ÉÒÔÊ¡ÂÔ<GridView.Columns>Õâ²ã±êÇ©£¬Ö±½ÓÔÚGridViewµÄÄÚÈݲ¿·Ö¶¨Òå3¸ö<GridViewColumn>¶ÔÏó£¬GridViewColumnÖÐ×îÖØÒªµÄÒ»¸öÊôÐÔÊÇDisplayBinding£¨ÀàÐÍÊÇBindingBase£©£¬Ê¹ÓÃÕâ¸öÊôÐÔ¿ÉÒÔÖ¸¶¨ÕâÒ»ÁÐʹÓÃʲôÑùµÄBindingÈ¥¹ØÁªÊý¾Ý------ÕâÓëListBoxÓе㲻ͬ£¬ListBoxʹÓõÄÊÇDisplayMemberPathÊôÐÔ(ÀàÐÍÊÇstring)¡£Èç¹ûÏëÓøü¸´ÔӵĽṹÀ´±íʾÕâÒ»±êÌâ»òÊý¾Ý£¬Ôò¿ÉΪGridViewColumnÉèÖÃHeadTemplateºÍCellTemplate£¬ËüÃǵÄÀàÐͶ¼ÊÇDataTemplate¡£
ÔËÐÐЧ¹ûÈçÏÂ:

ºǫ́´úÂëÈçÏÂ:
public Window9() { InitializeComponent(); DataTable dtInfo = CreateDataTable(); for (int i = 0; i < 10; i++) { DataRow dr = dtInfo.NewRow(); dr[0] = i; dr[1] = "ºïÍõ" + i; dr[2] = i + 10; dr[3] = "ÄÐ"; dtInfo.Rows.Add(dr); } this.listView1.ItemsSource = dtInfo.DefaultView; } private DataTable CreateDataTable() { DataTable dt = new DataTable("newtable"); DataColumn[] columns = new DataColumn[]{new DataColumn("Id"),
new DataColumn("Name"),new DataColumn("Age"),new DataColumn("Sex")}; dt.Columns.AddRange(columns); return dt; } |
ͨ¹ýÉÏÃæµÄÀý×ÓÎÒÃÇÒѾ֪µÀDataTableµÄDefaultView¿ÉÒÔ×öΪItemSourceÀ´Ê¹Óã¬ÄÃDataTableÖ±½ÓÓÿÉÒÔÂð£¬ÈÃÎÒÃÇÊÔÊÔ¿´£º
InitializeComponent(); DataTable dtInfo = CreateDataTable(); for (int i = 0; i < 10; i++) { DataRow dr = dtInfo.NewRow(); dr[0] = i; dr[1] = "ºïÍõ" + i; dr[2] = i + 10; dr[3] = "ÄÐ"; dtInfo.Rows.Add(dr); } this.listView1.ItemsSource = dtInfo; |
±àÒëµÄʱºòϵͳ»á±¨´íÌáʾ:
´íÎó 1ÎÞ·¨½«ÀàÐÍ¡°System.Data.DataTable¡±Òþʽת»»Îª¡°System.Collections.IEnumerable¡±¡£´æÔÚÒ»¸öÏÔʽת»»(ÊÇ·ñȱÉÙÇ¿ÖÆ×ª»»?)d:\ÎÒµÄÎĵµ\visual
studio 2010\Projects\WpfApplication2\WpfApplication1\Window9.xaml.cs3642WpfApplication1
ÏÔÈ»DataTable²»ÄÜÖ±½ÓÄÃÀ´ÎªItemSource¸³Öµ¡£²»¹ý£¬µ±Äã°ÑDataTable¶ÔÏó·ÅÔÚÒ»¸ö¶ÔÏóµÄContextÊôÐÔµÄʱºò£¬²¢°ÑÒ»¸öItemSourceÓëÒ»¸ö¼ÈûÓÐÖ¸¶¨SourceÓÖûÓÐÖ¸¶¨PathµÄBinding°ó¶¨ÆðÀ´µÄʱºò£¬BindingÈ´ÄÜ×Ô¶¯ÕÒµ½ËüµÄDefaultView²¢µ±×÷×Ô¼ºµÄSourceÀ´Ê¹Óãº
DataTable dtInfo = CreateDataTable(); for (int i = 0; i < 10; i++) { DataRow dr = dtInfo.NewRow(); dr[0] = i; dr[1] = "ºïÍõ" + i; dr[2] = i + 10; dr[3] = "ÄÐ"; dtInfo.Rows.Add(dr); } this.listView1.DataContext = dtInfo; this.listView1.SetBinding(ListView.ItemsSourceProperty, new Binding()); |
ËùÒÔ£¬Èç¹ûÄãÔÚ´úÂëÖз¢ÏÖ°ÑDataTable¶ø²»ÊÇDefaultView×÷ΪDataContextÖµ£¬²¢ÇÒΪItemSourceÉèÖÃÒ»¸ö¼ÈÎÞPathÓÖûÓÐSourceµÄBindingµÄʱºò£¬Ç§Íò±ð¸Ð¾õµ½ÒÉÂÇ¡£
1.3.9 ʹÓÃXMLÊý¾Ý×÷ΪBindingµÄÔ´
Æù½ñΪֹ£¬.NETFramWorkÌṩÁËÁ½Ì×´¦ÀíXMLÊý¾ÝµÄÀà¿â£º
·ûºÏDOM£¨Document Object Modle£¬Îĵµ¶ÔÏóÄ£ÐÍ£©±ê×¼Àà¿â£º°üÀ¨XmlDocument¡¢XmlElement¡¢XmlNode¡¢XmlAttributeµÈÀà¡£ÕâÌ×Àà¿âµÄÌØµãÊÇÖйæÖоأ¬¹¦ÄÜÇ¿´ó£¬µ«Ò²±³¸ºÁËÌ«¶àÁËXMLµÄ´«Í³ºÍ¸´ÔÓ¡£
ÒÔLINQ£¨Language-Intergrated Query£¬ÓïÑÔ¼¯³É²éѯ£©Îª»ù´¡µÄÀà¿â£º°üÀ¨XDocument£¬XElement£¬XNode£¬XAttributeµÈÀà¡£ÕâÌ×Àà¿âµÄÌØµãÊÇ¿ÉÒÔͨ¹ýLINQ½øÐвéѯºÍ²Ù×÷£¬·½±ã¿ì½Ý¡£
ÏÂÃæÎÒÃÇÖ÷Òª½²½âһϱê×¼ÀàÐ͵ÄÀà¿â£¬»ùÓÚLINQµÄ²éѯÎÒÃÇ·ÅÔÚÏÂÒ»½ÚÌÖÂÛ¡£
ÏÖÔÚ³ÌÐòÉè¼ÆÖ»ÒªÉæ¼°µ½Ô¶³Ì´«Êä¾ÍÀë²»¿ªXML£¬ÒòΪ´ó¶àÊýÊý¾Ý´«ÊäÊÇ»ùÓÚSOAP(Simple
Object Access Protocol£¬¼òµ¥¶ÔÏó·ÃÎÊÐÒé)Ïà¹ØÎĵµÐÒ飬¶øSOAPÓÖÊǽ«¶ÔÏóÐòÁл¯ÎªXMLÎı¾½øÐд«Êä¡£XMLÎı¾ÊÇÊ÷ÐνṹµÄ£¬ËùÒÔXML¿ÉÒÔ·½±ãµÄÓÃÓÚ±íʾÏßÐÔ¼¯ºÏ£¨ÈçArray¡¢ListµÈ£©ºÍÊ÷ÐνṹÊý¾Ý¡£
×¢Òâ:
ÔÚʹÓÃXMLÊý¾Ý×÷ΪBindingµÄSourceµÄʱºòÎÒÃǽ«Ê¹ÓÃXPathÊôÐÔ¶ø²»ÊÇPathÊôÐÔÀ´Ö¸¶¨Êý¾ÝµÄÀ´Ô´¡£
ÎÒÃÇÏÈ¿´Ò»¸öÏßÐÔ¼¯ºÏµÄÀý×Ó¡£ÏÂÃæµÄXMLÎı¾ÊÇÒ»×éÎı¾ÐÅÏ¢£¬ÎÒÃÇÒª°ÑËüÏÔʾÔÚÒ»¸öListView¿Ø¼þÀ
<?xml version="1.0" encoding="utf-8" ?> <StudentList> <Student id="1"> <Name>Andy</Name> </Student> <Student id="2"> <Name>Jacky</Name> </Student> <Student id="3"> <Name>Darren</Name> </Student> <Student id="4"> <Name>DK</Name> </Student> <Student id="1"> <Name>Jim</Name> </Student> </StudentList> |
¶ÔÓ¦µÄXAMLÈçÏ£º
<Window x:Class="WpfApplication1.Window10" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window10" Height="397" Width="485"> <StackPanel Width="409" Height="331" Background="LightBlue"> <ListView Height="302" Name="listView1" Width="396"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding XPath=@id}" Width="80"> </GridViewColumn> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding XPath=Name}" Width="150"> </GridViewColumn> </GridView> </ListView.View> </ListView> </StackPanel> </Window> |
C#´úÂëÈçÏ£º
private void BindingInfo() { XmlDocument doc = new XmlDocument(); doc.Load(@"d:\ÎÒµÄÎĵµ\visual studio 2010\Projects\WpfApplication2\WpfApplication1\StudentData.xml"); XmlDataProvider dp = new XmlDataProvider(); dp.Document = doc; dp.XPath = @"StudentList/Student"; this.listView1.DataContext = dp; this.listView1.SetBinding(ListView.ItemsSourceProperty, new Binding()); } |
³ÌÐòÔËÐÐЧ¹ûÈçÏ£º

XMLDataProvider»¹ÓÐÒ»¸öÃûΪSourceµÄÊôÐÔ£¬¿ÉÒÔÖ±½ÓÓÃËüÖ¸¶¨XMLÎĵµËùÔÚλÖã¨ÎÞÂÛÊÇXMLÎĵµÊÇ´æ´¢ÔÚ±¾µØÓ²ÅÌ»¹ÊÇÍøÂçλÖã©£¬ËùÒÔ£¬ºǫ́´úÂëÒ²¿ÉÒÔд³ÉÈçÏ£º
private void BindingInfo() { //XmlDocument doc = new XmlDocument(); //doc.Load(@"d:\ÎÒµÄÎĵµ\visual studio 2010\Projects\WpfApplication2\WpfApplication1\StudentData.xml"); XmlDataProvider dp = new XmlDataProvider(); dp.Source = new Uri(@"d:\ÎÒµÄÎĵµ\visual studio 2010\Projects\WpfApplication2\WpfApplication1\StudentData.xml"); // dp.Document = doc; dp.XPath = @"StudentList/Student"; this.listView1.DataContext = dp; this.listView1.SetBinding(ListView.ItemsSourceProperty, new Binding()); } |
XAML×î¹Ø¼üµÄÁ½¾ä£ºDisplayMemberBinding="{Binding
XPath=@id}"ºÍDisplayMemberBinding="{Binding
XPath=Name}"£¬ËûÃÇ·Ö±ðΪGridViewÁ½ÁÐÖ¸¶¨ÁËÒª¹Ø×¢µÄXML·¾¶----ºÜÃ÷ÏÔ£¬Ê¹ÓÃ@·ûºÅ¼Ó×Ö·û´®±íʾµÄÊÇXMLÔªËØµÄAttribute£¬²»¼Ó@·ûºÅ±íʾµÄÊÇ×Ó¼¶ÔªËØ¡£
XMLÓïÑÔ¿ÉÒÔ·½±ãµÄ±íʾÊ÷ÐÎÊý¾Ý½á¹¹£¬ÏÂÃæµÄÀý×ÓÊÇʹÓÃTreeView¿Ø¼þÀ´ÏÔʾӵÓÐÈô¸É²ãĿ¼µÄÎļþϵͳ£¬¶øÇÒ£¬Õâ´Î°ÑXMLÊý¾ÝºÍXMLDataProvider¶ÔÏóÖ±½ÓдÔÚXAMLÀïÃæ£¬´úÂëÖÐÓõ½ÁËHierarchicalDataTemplateÀ࣬Õâ¸öÀà¾ßÓÐItemsSourceÊôÐÔ£¬¿É¼ûÓÉÕâÖÖTemplateչʾµÄÊý¾ÝÊÇ¿ÉÒÔÓÐ×Ó¼¶¼¯ºÏµÄ¡£´úÂëÈçÏ£º
<Window x:Class="WpfApplication1.Window11" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window11" Height="349" Width="545"> <Window.Resources> <XmlDataProvider x:Key="xdp" XPath="FileSystem/Folder"> <x:XData> <FileSystem xmlns=""> <Folder Name="Books"> <Folder Name="Programming"> <Folder Name="Windows"> <Folder Name="WPF"> </Folder> <Folder Name="Winform"> </Folder> <Folder Name="ASP.NET"> </Folder> </Folder> </Folder> </Folder> <Folder Name="Tools"> <Folder Name="Development"/> <Folder Name="Designment"/> <Folder Name="Players"/> </Folder> </FileSystem> </x:XData> </XmlDataProvider> </Window.Resources> <Grid> <TreeView Height="283" HorizontalAlignment="Left" Name="treeView1"
VerticalAlignment="Top" Width="511" ItemsSource="{Binding Source={StaticResource ResourceKey=xdp}}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding XPath=Folder}"> <TextBlock Height="23" HorizontalAlignment="Left"
Name="textBlock1" Text="{Binding XPath=@Name}" VerticalAlignment="Top" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> </Grid> </Window> |
×¢Ò⣺
½«XmlDataProviderÖ±½ÓдÔÚXAML´úÂëÀïÃæ£¬ÄÇôËûµÄÊý¾ÝÐèÒª·ÅÔÚ<x:XData>±êÇ©ÖС£
ÓÉÓÚ±¾Àý×ÓÉè¼Æµ½ÁËStaticResourceºÍHierarchicalDataTemplate£¬¶¼ÊǺóÃæµÄÄÚÈÝ£¬Ïà¶Ô±È½ÏÄѶ®£¬µÈѧϰÍêºóÃæµÄResourceºÍTemplateÕ½ÚÖ®ºóÔÙ»ØÀ´±ã»áÁËÈ»ÓÚÐØ¡£
³ÌÐòÔËÐÐЧ¹ûÈçÏÂͼ£º

1.3.10 ʹÓÃLINQ¼ìË÷½á¹û×öΪBinding µÄÔ´
ÖÁ3.0°æ±¾¿ªÊ¼£¬.NET Framework¿ªÊ¼Ö§³ÖLINQ£¨Language-Intergrated
Query ÓïÑÔ¼¯³É²éѯ£©£¬Ê¹ÓÃLINQ£¬ÎÒÃÇ¿ÉÒÔ·½±ãµÄ²Ù×÷¼¯ºÏ¶ÔÏó¡¢DataTable¶ÔÏóºÍXML¶ÔÏ󲻱ض¯éü²»¶¯°ÑºÃ¼¸²ãforeachÑ»·Ç¶Ì×ÔÚÒ»ÆðÈ´Ö»ÊÇΪÁËÍê³ÉÒ»¸öºÜ¼òµ¥µÄÈÎÎñ¡£
LINQ²éѯµÄ½á¹ûÊÇÒ»¸öIEnumerable<T>ÀàÐͶÔÏ󣬶øIEnumerable<T>ÓÖÅÉÉú×ÔIEnumerable£¬ËùÒÔËü¿ÉÒÔ×÷ΪÁÐ±í¿Ø¼þµÄItemsSourceÀ´Ê¹Óá£
ÏÈ´´½¨Ò»¸öÃûΪStudentµÄÀࣺ
public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } |
XAML´úÂëÈçÏ£º
<Window x:Class="WpfApplication1.Window12" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window12" Height="372" Width="538"> <Grid> <ListView Height="311" HorizontalAlignment="Left"
Margin="10,10,0,0" Name="listView1" VerticalAlignment="Top" Width="494"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="100"/> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="100"/> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="100"/> </GridView> </ListView.View> </ListView> </Grid> </Window> |
ºǫ́´úÂëÈçÏ£º
private void BindingData() { List<Student> infos = new List<Student>() { new Student(){Id=1, Age=29, Name="Tim"}, new Student(){Id=1, Age=28, Name="Tom"}, new Student(){Id=1, Age=27, Name="Kyle"}, new Student(){Id=1, Age=26, Name="Tony"}, new Student(){Id=1, Age=25, Name="Vina"}, new Student(){Id=1, Age=24, Name="Mike"} }; this.listView1.ItemsSource = from stu in infos where stu.Name.StartsWith("T") select stu; } |
Èç¹ûÊý¾Ý´æ·ÅÔÚÒ»¸öDataTable¶ÔÏóÀïÃæ£¬Ôòºǫ́´úÂëÈçÏ£º
private void BindingDataByDataTable() { DataTable dtInfo = CreateDataTable(); this.listView1.ItemsSource = from row in dtInfo.Rows.Cast<DataRow>() where Convert.ToString(row["Name"]).StartsWith("T") select new Student() { Id = Convert.ToInt32(row["Id"]), Name=Convert.ToString(row["Name"]),Age=Convert.ToInt32(row["Age"]) }; } |
Èç¹ûÊý¾Ý´æ´¢ÔÚXMLÀïÃæ£¬´æ´¢¸ñʽÈçÏ£º
<?xml version="1.0" encoding="utf-8" ?> <StudentList> <Class> <Student Id="0" Age="29" Name="Tim" /> <Student Id="0" Age="28" Name="Tom" /> <Student Id="0" Age="27" Name="Mess" /> </Class> <Class> <Student Id="0" Age="26" Name="Tony" /> <Student Id="0" Age="25" Name="Vina" /> <Student Id="0" Age="24" Name="Emily" /> </Class> </StudentList> |
Ôò´úÂëÊÇÕâÑù£¨×¢Ò⣺xd.Descendants("Student")Õâ¸ö·½·¨£¬Ëü¿ÉÒÔ¿çXMLµÄ²ã¼¶£©£º
private void BindingDataByXml() { XDocument xd = XDocument.Load(@"
d:\ÎÒµÄÎĵµ\visual studio 2010\Projects\WpfApplication2\WpfApplication1\testDate.xml"); this.listView1.ItemsSource = from element in xd.Descendants("Student") where element.Attribute("Name").Value.StartsWith("T") select new Student() { Name = element.Attribute("Name").Value, Id = Convert.ToInt32(element.Attribute("Id").Value), Age = Convert.ToInt32(element.Attribute("Age").Value) }; } |
³ÌÐòÔËÐÐЧ¹ûÈçÏÂͼ:

1.3.11 ʹÓÃObjectDataProvider×÷ΪbindingµÄSource
ÀíÏëÇé¿öÏ£¬ÉÏÓγÌÐòÔ±½«ÀàÉè¼ÆºÃ¡¢Ê¹ÓÃÊôÐÔ°ÑÊý¾Ý±©Â¶³öÀ´£¬ÏÂÓγÌÐòÔ±½«ÕâЩÀà×÷ΪBindingµÄSource¡¢°ÑÊôÐÔ×÷ΪBindingµÄPathÀ´Ïû·ÑÕâЩÀà¡£µ«ºÜÄѱ£Ö¤Ò»¸öÀàµÄÊôÐÔ¶¼ÓÃÊôÐÔ±©Â¶³öÀ´£¬±ÈÈçÎÒÃÇÐèÒªµÄÊý¾Ý¿ÉÄÜÊÇ·½·¨µÄ·µ»ØÖµ¡£¶øÖØÐÂÉè¼Æµ×²ãÀàµÄ·çÏպͳɱ¾»á±È½Ï¸ß£¬¿öÇÒºÚºÐÒýÓÃÀà¿âµÄÇé¿öÏÂÎÒÃDz»¿ÉÄܸü¸ÄÒѾ±àÒëºÃµÄÀ࣬ÕâʱºòÐèҪʹÓÃObjectDataProviderÀ´°ü×°×öΪBindingÔ´µÄÊý¾Ý¶ÔÏóÁË¡£
ObjcetDataProvider ¹ËÃû˼Òå¾ÍÊǰѶԶÔÏó×÷ΪÊý¾ÝÔ´Ìṩ¸øBinding¡£Ç°Ã滹Ìáµ½¹ýXmlDataProvider£¬ÕâÁ½¸öÀàµÄ¸¸Àà¶¼ÊÇDataSourceProvider³éÏóÀà¡£
ÏÖÔÚÓÐÒ»¸öÃûΪCalculatorµÄÀ࣬Ëü¾ßÓмӡ¢¼õ¡¢³Ë¡¢³ýµÄ·½·¨£º
public class Caculate { public string Add(string arg1,string arg2) { double x = 0; double y = 0; double z = 0; if(double.TryParse(arg1,out x)&&double.TryParse(arg2,out y)) { z = x + y; return z.ToString(); } return "Iput Error"; } //ÆäËü·½·¨Ê¡ÂÔ } |
ÎÒÃÇÏÈдһ¸ö·Ç³£¼òµ¥µÄСÀý×ÓÀ´Á˽âÏÂObjectDataProviderÀà¡£Ëæ±ãн¨Ò»¸öWPF´°Ì壬´°ÌåÄÚÍÏ·ÅÒ»¸ö¿Ø¼þ£¬¿Ø¼þµÄClickʼþÈçÏ£º
private void button1_Click(object sender, RoutedEventArgs e) { ObjectDataProvider odp = new ObjectDataProvider(); odp.ObjectInstance = new Caculate(); odp.MethodName="Add"; odp.MethodParameters.Add("100"); odp.MethodParameters.Add("200"); MessageBox.Show(odp.Data.ToString()); } |
ÔËÐгÌÐò£¬µ¥»÷buttonÎÒÃǻῴµ½ÈçϽçÃæ£º

ͨ¹ýÕâ¸ö³ÌÐòÎÒÃÇ¿ÉÒÔÁ˽⵽ObjectDataProvider¶ÔÏóºÍËü±»°ü×°µÄ¶ÔÏó¹ØÏµÈçÏÂͼ£º

Á˽âÁËObjectDataProviderµÄʹÓ÷½·¨£¬ÎÒÃÇ¿´¿´ÈçºÎ°ÑËüµ±×÷BindingµÄSourceÀ´Ê¹ÓᣳÌÐòµÄXAML´úÂëºÍ½ØÍ¼ÈçÏ£º
<Window x:Class="WpfApplication1.Window14" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window14" Height="202" Width="345"> <StackPanel Background="LightBlue"> <TextBox Height="23" Name="textBox1" Width="200" HorizontalAlignment="Left" Margin="15"/> <TextBox Height="23" Name="textBox2" Width="200" HorizontalAlignment="Left" Margin="15"/> <TextBox Height="23" Name="textBox3" Width="200" HorizontalAlignment="Left" Margin="15"/> </StackPanel> </Window> |

Õâ¸ö³ÌÐòʵÏֵŦÄÜÊÇ£¬ÎÒÔÚǰÁ½¸öTextBoxÀïÃæÊäÈëÖµµÄʱºò£¬µÚÈý¸öTextBox»áÏÔʾǰÁ½¸öÎı¾¿òÀïÃæÏà¼ÓÖ®ºÍ¡£°Ñ´úÂëдÔÚÒ»¸öÃûΪSetBindingµÄ·½·¨ÀïÃæ£¬È»ºóÔÚ´°ÌåµÄ¹¹ÔìÆ÷ÀïÃæµ÷ÓÃÕâ¸ö·½·¨£º
private void SetBinding() { ObjectDataProvider objpro = new ObjectDataProvider(); objpro.ObjectInstance = new Caculate(); objpro.MethodName = "Add"; objpro.MethodParameters.Add("0"); objpro.MethodParameters.Add("0"); Binding bindingToArg1 = new Binding("MethodParameters[0]")
{ Source=objpro,BindsDirectlyToSource=true, UpdateSourceTrigger= UpdateSourceTrigger.PropertyChanged}; Binding bindingToArg2 = new Binding("MethodParameters[1]")
{ Source=objpro,BindsDirectlyToSource=true,UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged}; Binding bindToResult = new Binding(".") { Source=objpro}; this.textBox1.SetBinding(TextBox.TextProperty, bindingToArg1); this.textBox2.SetBinding(TextBox.TextProperty, bindingToArg2); this.textBox3.SetBinding(TextBox.TextProperty,bindToResult); } |
ÈÃÎÒÃÇÏÈÀ´·ÖÎöÒ»ÏÂÉÏÃæÁ½¶Î´úÂë£¬Ç°ÃæËµ¹ý£¬ObjectDataProviderÀàµÄ×÷ÓÃÊǰü×°Ò»¸öÒÔ·½·¨±©Â¶Êý¾ÝµÄ¶ÔÏó£¬ÕâÀïÎÒÃÇÏÈ´´½¨ÁËÒ»¸öObjectDataProviderµÄ¶ÔÏó£¬È»ºóÓÃÒ»¸öCaculate¶ÔÏóΪÆäObjectInstance¶ÔÏó¸³Öµ---Õâ¾Í°ÑÒ»¸öCaculate¶ÔÏó°ü×°ÔÚÁËObjectDataProviderÀïÃæ¡£»¹ÓÐÁíÍâÒ»¸ö°ì·¨À´´´½¨±»°ü×°µÄ¶ÔÏó£¬ÄǾÍÊǸæËß°ü×°¶ÔÏó±»°ü×°¶ÔÏóµÄÀàÐͺÍÏ£Íûµ÷ÓõĹ¹ÔìÆ÷£¬ÈÃObjectDataProvider×Ô¼ºÀ´´´½¨¶ÔÏ󣬴úÂë´ó¸ÅÊÇÕâÑù£º
//--- objpro.ObjectInstance = typeof(Caculate); objpro.ConstructorParameters.Add(arg1); objpro.ConstructorParameters.Add(arg2); //---- |
ÒòΪÔÚXAMLÖд´½¨¶ÔÏó±È½ÏÂé·³£¬¿É¶ÁÐԲËùÒÔÎÒÃÇÒ»°ã»áÔÚXAML´úÂëÖÐʹÓÃÕâÖÖÖ¸¶¨ÀàÐͺ͹¹ÔìÆ÷µÄ°ì·¨¡£
½Ó×Å£¬ÎÒÃÇʹÓÃMethodNameÊôÐÔÖ¸¶¨Òªµ÷ÓõÄCaculator¶ÔÏóÖÐÃûΪAddµÄ·½·¨---ÎÊÌâÓÖÀ´ÁË£¬Èç¹ûCaculatorÓжà¸ö¹¹ÔìÆ÷²ÎÊýµÄ·½·¨AddÓ¦¸ÃÈçºÎÇø·Ö£¿ÎÒÃÇÖªµÀ£¬ÖØÔØ·½·¨µÄÇø±ðÔÚÓÚ²ÎÊýÁÐ±í£¬½ô½Ó×ÅÁ½¾ä¾ÍÊÇÏòMethodParameterÊôÐÔÀïÃæ¼ÓÈëÁ½¸östringÀàÐ͵IJÎÊý£¬Õâ¾ÍÏ൱ÓÚ¸æËßObjectDataProvider¶ÔÏóÈ¥µ÷ÓÃCaculator¶ÔÏóÖоßÓÐÁ½¸östringÀàÐͲÎÊýµÄAdd·½·¨£¬»»¾ä»°Ëµ£¬MethodParameter¶ÔÓÚ²ÎÊýµÄ¸ÐÓ¦ÊǷdz£Ãô¸ÐµÄ¡£
×¼±¸ºÃÊý¾ÝÔ´Ö®ºó£¬ÎÒÃÇ×¼±¸´´½¨Binding¡£Ç°ÃæÎÒÃÇÒѾ½²¹ýʹÓÃË÷ÒýÆ÷×÷ΪBindingµÄPath£¬µÚÒ»¸öBindingËüµÄSourceÊÇÒ»¸öObjectDataProvider¶ÔÏó£¬PathÊÇObjectDataProviderÖÐMethodParametersËùÒýÓõĵÚÒ»¸öÔªËØ¡£BindsDirectlyToSourceÕâ¾ä»°ÊǸæËßBindingÖ»Êǽ«UIÉϵÄÖµ´«µÝ¸øÔ´¶ø²»ÊDZ»ObjectDataProvider°ü×°µÄCaculator£¬Í¬Ê±UpdateSourceTriggerÉèÖÃΪUIÖ»ÒªÒ»Óб仯¾Í¸üÐÂSource¡£µÚ¶þ¸öBindingÖ»ÊǶԵÚÒ»¸öµÄ·°æ£¬Ö»ÊǰÑPathÊôÐÔÖ¸ÏòÁ˵ڶþ¸öÔªËØ¡£µÚÈý¸öbindingÈÔȻʹÓÃObjectDataProvider×÷ΪSource£¬µ«Ê¹Óá°.¡±×÷ΪPath----Ç°Ãæ½²¹ý£¬µ±Êý¾ÝÔ´±¾Éí¾ÍÊÇÊý¾ÝµÄʱºò¾ÍÓá°.¡±À´×öΪPath£¬ÔÚXAMLÖÐ"."¿ÉÒÔ²»Ð´¡£
×¢Ò⣺
ÔÚObjectDataProvider¶ÔÏó×÷ΪBindingµÄSourceµÄʱºò£¬Õâ¸ö¶ÔÏó±¾Éí¾Í´ú±íÁËÊý¾Ý£¬ËùÒÔÕâÀïµÄPathʹÓõġ°.¡±£¬¶ø²»ÊÇDataÊôÐÔ¡£
×îºó¼¸ÐоÍÊǽ«Binding¶ÔÏó¹ØÁªµ½3¸öTextBox¶ÔÏóÉÏ¡£³ÌÐòÔËÐÐЧ¹ûÈçÏ£º

Ò»°ãÇé¿öÏÂÊý¾Ý´ÓÄÇÀïÀ´£¬ÄÄÀï¾ÍÊÇBindingµÄSource£¬Êý¾Ýµ½ÄÄÀïÈ¥£¬ÄÄÀï¾ÍÊÇBinding
µÄTarget¡£°´Õâ¸öÀíÂÛ£¬Ç°Á½¸öTextBoxÓ¦¸ÃÊÇObjcetDataProviderµÄÔ´£¬¶øObjcetDataProvider¶ÔÏóÓÖÊÇ×îºóÒ»¸öTextBoxµÄÔ´¡£µ«Êµ¼ÊÉÏ£¬Èý¸öTextBox¶¼ÒÔObjcetDataProvider×÷ΪÊý¾ÝÔ´£¬Ö»ÊÇǰÁ½¸öÔÚÊý¾ÝÁ÷ÏòÉÏ×öÁËÏÞÖÆ£¬ÕâÑù×öµÄÔÒò²»ÍâºõÓÐÁ½¸ö£º
1¡¢ObjcetDataProviderµÄMethodParameter²»ÊÇÒÀÀµÊôÐÔ£¬²»ÄÜ×÷ΪBindingµÄÄ¿±ê¡£
2¡¢Êý¾ÝÇý¶¯UIÀíÄîÒªÇóÎÒÃǾ¡¿ÉÄܵÄʹÓÃÊý¾Ý¶ÔÏó×÷ΪBindingµÄSource¶ø°ÑUIµ±×öBindingµÄTarget¡£
1.3.12 ʹÓÃBindingµÄRelativeSource
µ±Ò»¸öBindingÓÐÃ÷È·µÄÀ´Ô´µÄʱºò£¬ÎÒÃÇ¿ÉÒÔͨ¹ýSource»òÕßElementName¸³ÖµµÄ°ì·¨ÈÃBindingÓëÖ®¹ØÁª¡£ÓÐЩʱºòÎÒÃDz»ÄÜÈ·¶¨×÷ΪSource¶ÔÏó½ÐʲôÃû×Ö£¬µ«ÊÇÎÒÃÇÖªµÀËüÓë×öΪBindingÄ¿±ê¶ÔÏóÔÚUIÉϵÄÏà¶Ô¹ØÏµ£¬±ÈÈç¿Ø¼þ×Ô¼º¹ØÁª×Ô¼ºµÄij¸öÊý¾Ý£¬¹ØÁª×Ô¼ºÄ³¼¶ÈÝÆ÷µÄÊý¾Ý£¬Õâʱºò¾ÍÐèÒªÓõ½BindingµÄRelativeSourceÊôÐÔ¡£
RelativeSourceÊôÐÔµÄÀàÐÍÊÇRelativeSourceÀ࣬ͨ¹ýÕâ¸öÀàµÄ¼¸¸ö¾²Ì¬»òÕ߷Ǿ²Ì¬µÄÊôÐÔÎÒÃÇ¿ÉÒÔ¿ØÖÆËüËÑË÷Ïà¶ÔÊý¾ÝÔ´µÄ·½Ê½¡£Çë¿´ÏÂÃæÕâ¶Î´úÂ룺
<Window x:Class="WpfApplication1.Window15" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window15" Height="375" Width="516"> <Grid Background="Red" Margin="10" x:Name="gd1"> <DockPanel x:Name="dp1" Margin="10" Background="Orange"> <Grid Background="Yellow" Margin="10" x:Name="gd2"> <DockPanel Name="dp2" Margin="10" Background="LawnGreen"> <TextBox Name="textBox1" Margin="10" FontSize="24"/> </DockPanel> </Grid> </DockPanel> </Grid> </Window> |
½çÃæÔËÐнá¹ûÈçÏ£º

ÎÒÃǰÑTextBoxµÄTextÊôÐÔ¹ØÁªµ½Íâ²ãÈÝÆ÷µÄNameÊôÐÔÉÏ¡£ÔÚ´°ÌåµÄ¹¹ÔìÆ÷ÀïÃæÌí¼ÓÈçϼ¸ÐдúÂ룺
RelativeSource rs = new RelativeSource(RelativeSourceMode.FindAncestor); rs.AncestorLevel = 1; rs.AncestorType = typeof(Grid); Binding bind = new Binding("Name") { RelativeSource = rs }; this.textBox1.SetBinding(TextBox.TextProperty, bind); |
»òÔÚXAML´úÂëÖвåÈëµÈЧ´úÂ룺
<TextBox Name="textBox1" Margin="10" FontSize="24" Text="{Binding Path=Name,
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Grid},AncestorLevel=1}}"/> |
AncestorLevelÊôÐÔÖ¸¶¨µÄÊÇÒÔBindingÄ¿±ê¿Ø¼þΪÆðµãµÄ²ã¼¶Æ«ÒÆÁ¿---gd2µÄÆ«ÒÆÁ¿ÊÇ1£¬gd2µÄÆ«ÒÆÁ¿ÊÇ2£¬ÒÀ´ÎÀàÍÆ¡£AncestorTypeÊôÐÔ¸æËßBindingÈ¥ÕÒʲôÀàÐ͵ĶÔÏó×÷Ϊ×Ô¼ºµÄÔ´£¬²»ÊÇÕâ¸öÀàÐ͵ĶÔÏó»á±»Ìø¹ý¡£ÉÏÃæÕâ¶Î´úÂëµÄÒâ˼ÊǸæËßBinding´Ó×Ô¼ºµÄµÚÒ»²ãÒÀ´ÎÏòÍâÕÒ£¬ÕÒµ½µÚÒ»¸öGridÀàÐͶÔÏóºó°ÑËüµ±×÷×Ô¼ºµÄÔ´¡£ÔËÐÐЧ¹ûÈçÏÂͼ£º

Èç¹û°Ñ´úÂë¸Ä³ÉÈçÏÂÕâÑù£º
RelativeSource rs = new RelativeSource(RelativeSourceMode.FindAncestor); rs.AncestorLevel = 2; rs.AncestorType = typeof(DockPanel); Binding bind = new Binding("Name") { RelativeSource = rs }; this.textBox1.SetBinding(TextBox.TextProperty, bind); |
»òÕß°ÑXAML´úÂë¸Ä³ÉÈçÏ£º
Text="{Binding Path=Name, RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DockPanel},AncestorLevel=2}}" |
ÔËÐÐЧ¹ûÈçÏ£º

Èç¹ûTextBoxÐèÒª¹ØÁª×ÔÉíµÄNameÊôÐÔ£¬ÄÇô´úÂëÓ¦¸ÃÕâÑùд£º
RelativeSource rs = new RelativeSource(RelativeSourceMode.Self); Binding bind = new Binding("Name") { RelativeSource = rs }; this.textBox1.SetBinding(TextBox.TextProperty, bind); |
¶ÔÓ¦µÄXAML´úÂëÈçÏ£º
Text="{Binding Path=Name, RelativeSource={RelativeSource Mode=Self}}" |
ÔËÐÐЧ¹ûÈçÏÂͼ£º

RelativeSourceÀàµÄModeÊôÐÔÊÇRelativeSourceModeö¾Ù£¬ËüµÄÖµÓУºPriviousData¡¢TemplatedParent¡¢SelfºÍFindAncestor¡£RelativeSource»¹ÓÐ3¸ö¾²Ì¬ÊôÐÔ£ºPriviousData¡¢Self¡¢TemplatedParent£¬ËüÃǵÄÀàÐÍÊÇRelativeSourceÀࡣʵ¼ÊÉÏÕâ3¸ö¾²Ì¬ÊôÐÔ¾ÍÊÇ´´½¨Ò»¸öRelativeSourceµÄʵÀý¡¢°ÑʵÀýµÄModeÉèÖÃΪÏà¶ÔÓ¦µÄÖµ£¬È»ºó·µ»ØÕâ¸öʵÀý¡£Ö®ËùÒÔ×¼±¸Õâ3¸ö¾²Ì¬ÊôÐÔÊÇΪÁËÔÚXAML´úÂëÀïÃæÖ±½Ó»ñÈ¡RelativeSourceʵÀý¡£
ÔÚDataTemplateÖо³£Óõ½ÕâÕâ3¸ö¾²Ì¬ÊôÐÔ£¬Ñ§Ï°DataTemplateµÄʱºòÇëÁôÒâËüÃǵÄʹÓ÷½·¨¡£
1.4 binding¶ÔÊý¾ÝµÄת»»ºÍУÑé
Ç°ÃæÎÒÃÇÒѾ֪µÀBindingµÄ×÷ÓþÍÊǼÜÔÚSourceºÍTargetÖ®¼äµÄÇÅÁº£¬Êý¾Ý¿ÉÒÔÔÚÕâ×ùÇÅÁºµÄ°ïÖúÏÂÀ´Á÷ͨ¡£¾ÍÏñÏÖʵÉç»áÖÐÇÅÁºÐèÒªÉèÖð²¼ìºÍ¹Ø¿¨Ò»Ñù£¬BindingÕâ×ùÇÅÉÏÒ²¿ÉÒÔÉèÖùؿ¨¶ÔÊý¾Ý½øÐÐÑéÖ¤£¬²»½öÈç´Ë£¬Èç¹ûBindingÁ½¶ËÐèÒª²»Í¬µÄÊý¾ÝÀàÐ͵ÄʱºòÎÒÃÇ»¹¿ÉÒÔΪÊý¾ÝÉèÖÃת»»Æ÷¡£
BindingÓÃÓÚÊý¾ÝÓÐЧÐÔУÑéµÄ¹Ø¿¨ÊÇËûµÄValidationRulesÊôÐÔ£¬ÓÃÓÚÊý¾ÝÀàÐÍת»»µÄ¹Ø¿¨ÊÇËüµÄConvertÊôÐÔ¡£
1.4.1 BindingµÄÊý¾ÝУÑé
BindingµÄValidationRulesÊôÐÔÊÇCollection<ValidationRule>£¬´ÓËüµÄÃû³ÆºÍÊý¾ÝÀàÐÍÎÒÃÇ¿ÉÒÔµÃÖª¿ÉÒÔΪÿ¸öBindingÉèÖöà¸öÊý¾ÝУÑéÌõ¼þ£¬Ã¿Ò»¸öÌõ¼þÊÇÒ»¸öValidationRule¶ÔÏó¡£ValidationRuleÊÇÒ»¸ö³éÏóÀ࣬ÔÚʹÓõÄʱºòÎÒÃÇÐèÒª´´½¨ËüµÄÅÉÉúÀಢʵÏÖËüµÄValidate·½·¨µÄ·µ»ØÖµÊÇValidateionResultÀàÐͶÔÏó£¬Èç¹ûͨ¹ýÑéÖ¤£¬¾Í°ÑValidateionResult¶ÔÏóµÄIsValidateÊôÐÔÉèΪtrue£¬·´Ö®£¬ÔòÐèÒª½«IsValidateÉèÖÃΪfalse²¢ÎªÆäErrorContentÊôÐÔÉèÖÃÒ»¸öºÏÊʵÄÏûÏ¢ÄÚÈÝ£¨Ò»°ãÊÇ×Ö·û´®£©¡£
ÏÂÃæÕâ¸ö³ÌÐòµÄUI»æÖÆÒ»¸öTextBoxºÍÒ»¸öSlider£¬È»ºóÔÚºǫ́C#´úÂëÖн¨Á¢Binding°ÑËüÃǹØÁªÆðÀ´----
ÒÑSlideΪԴ£¬TextBoxΪĿ±ê¡£SliderµÄȡֵ·¶Î§ÊÇ0~100£¬Ò²¾ÍÊÇ˵ÎÒÃÇÐèÒªÑéÖ¤TextBoxÖÐÊäÈëµÄÖµÊDz»ÊÇÔÚ0~100Ö®¼ä¡£
³ÌÐòµÄXAML²¿·ÖÈçÏ£º
<Window x:Class="WpfApplication1.Window16" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window16" Height="300" Width="300"> <StackPanel Background="AliceBlue" Margin="10"> <TextBox Height="23" Name="textBox1" Width="200" Margin="20"/> <Slider Height="23" Name="slider1" Width="219" Maximum="100" /> </StackPanel> </Window> |
ΪÁ˽øÐÐУÑ飬ÎÒÃÇ×¼±¸Ò»¸öValidationRuleµÄÅÉÉúÀ࣬ÄÚÈÝÈçÏ£º
public class RangeValidationRule : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { double d = 0; if(double.TryParse(value.ToString(),out d)) { if(d>=0&&d<=100) { return new ValidationResult(true,null); } } return new ValidationResult(false,"ErrorContent"); } } |
È»ºóÔÚ´°ÌåÀïÃæ½¨Á¢Binding£º
public Window16() { InitializeComponent(); Binding bind =new Binding("Value")
{ UpdateSourceTrigger= UpdateSourceTrigger.PropertyChanged,Source=slider1, Mode= BindingMode.TwoWay}; ValidationRule rule = new RangeValidationRule(); rule.ValidatesOnTargetUpdated = true; bind.ValidationRules.Add(rule); this.textBox1.SetBinding(TextBox.TextProperty, bind); } |
Íê³ÉºóÔËÐгÌÐò£¬µ±ÊäÈë0~100Ö®¼äµÄÖµµÄʱºò³ÌÐòÕý³£ÏÔʾ£¬µ«ÊÇÊäÈëÇø¼äÖ®ÍâµÄÖµµÄʱºòTextBox»áÏÔʾΪºìÉ«±ß¿ò£¬±íʾֵÊÇ´íÎóµÄ£¬²»ÄÜ´«Öµ¸øSource¡£Ð§¹ûÈçÏÂͼ£º
 
ÏȰÑSiliderµÄȡֵ·¶Î§´Ó0~100¸ÄΪ-100~200£º
 
ÄãÒ²Ðí»ØÏ룬ÔÚÑéÖ¤´íÎóµÄʱºò£¬ValidationResult»áЯ´øÒ»Ìõ´íÎóÐÅÏ¢£¬ÄÇôÈçºÎʹÓÃÕâÌõ´íÎóÐÅÏ¢ÄØ£¿ÏëÒªÓõ½ÕâÒ»µã£¬ÐèÒªÓõ½ºóÃæ»áÏêϸ½²½âµ½µÄ֪ʶ-----·ÓÉʼþ£¨Routed
Event£©¡£
Ê×ÏÈÔÚ´´½¨Binding µÄʱºòÒª°ÑBindingµÄ¶ÔÏóµÄNotifyOnValidationErrorÊôÐÔÉèÖÃΪtrue£¬ÕâÑù£¬µ±Êý¾ÝУÑéʧ°ÜµÄʱºòBinding¾ÍÏñ±¨¾¯Æ÷Ò»Ñù·¢³öÒ»¸öÐźš£Õâ¸öÐźŻáÔÚÒÑBinding¶ÔÏóµÄTargetΪÆðµãµÄUIÊ÷ÉϽøÐд«²¥¡£ÐźÅûµ½´ïÒ»¸ö½Úµã£¬Èç¹ûÕâ¸ö½ÚµãÉèÖÃÁ˶ÔÕâÖÖÐźŵÄÕìÌýÆ÷£¨Ê¼þ´¦ÀíÆ÷£©£¬ÄÇôÕâ¸öÕìÌýÆ÷¾Í»á±»´¥·¢²¢´¦ÀíÕâ¸öÐźţ¬ÐźŴ¦ÀíÍê±Ïºó£¬»¹¿ÉÒÔÊÇ·ñÈÃÐźżÌÐøÑØ×ÅUIÊ÷ÏòÉÏ´«²¥---Õâ¾ÍÊÇ·ÓÉʼþ¡£ÐźÅÔÚUIÊ÷ÉÏ´«µÝµÄ¹ý³Ì³ÆÎªÂ·ÓÉ£¨Route£©¡£
½¨Á¢BindingµÄ´úÂëÈçÏ£º
public Window16() { InitializeComponent(); Binding bind =new Binding("Value")
{ UpdateSourceTrigger= UpdateSourceTrigger.PropertyChanged,Source=slider1, Mode= BindingMode.TwoWay}; ValidationRule rule = new RangeValidationRule(); rule.ValidatesOnTargetUpdated = true; bind.ValidationRules.Add(rule); bind.NotifyOnValidationError = true; this.textBox1.SetBinding(TextBox.TextProperty, bind); this.textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(ValidationError)); } |
ÓÃÓÚÕìÌýУÑé´íÎóʼþµÄʼþ´¦ÀíÆ÷ÈçÏ£º
private void ValidationError(object sender, RoutedEventArgs e) { if (Validation.GetErrors(textBox1).Count > 0) { this.textBox1.ToolTip = Validation.GetErrors(textBox1)[0].ErrorContent.ToString(); } else { this.textBox1.ToolTip = ""; } } |
³ÌÐòÈç¹ûУÑéʧ°Ü£¬¾Í»áʹÓÃToolTipÌáʾÓû§£¬ÈçÏÂͼ£º

1.4.2 BindingµÄÊý¾Ýת»»
Ç°ÃæµÄºÜ¶àÀý×ÓÎÒÃǶ¼ÔÚʹÓÃBinding½«TextBoxºÍSliderÖ®¼ä½¨Á¢¹ØÁª----Slider¿Ø¼þ×÷ΪSource£¨PathµÄValueÊôÐÔ£©£¬TextBox×÷ΪTarget£¨Ä¿±êÊôÐÔΪText£©¡£²»ÖªµÀ´ó¼ÒÓÐûÓÐ×¢Òâµ½£¬SliderµÄValueÊôÐÔÊÇDoubleÀàÐÍÖµ£¬¶øTextBoxµÄTextÊôÐÔÊÇstringÀàÐ͵ÄÖµ£¬ÔÚC#ÕâÖÖÇ¿ÀàÐÍÓïÑÔÖÐÈ´¿ÉÒÔÀ´Íù×ÔÈ磬ÊÇÔõô»ØÊÂÄØ£¿
ÔÀ´Binding»¹ÓÐÁíÍâÒ»ÖÖ»úÖÆ³ÆÎªÊý¾Ýת»»£¬µ±Source¶ËÖ¸¶¨µÄPathÊôÐÔÖµºÍTarget¶ËÖ¸¶¨µÄÄ¿±êÊôÐÔ²»Ò»ÖµÄʱºò£¬ÎÒÃÇ¿ÉÒÔÌí¼ÓÊý¾Ýת»»Æ÷£¨DataConvert£©¡£ÉÏÃæÎÒÃÇÌáµ½µÄÎÊÌâʵ¼ÊÉϾÍÊÇdoubleºÍstirngÀàÐÍÏ໥ת»»µÄÎÊÌ⣬ÒòΪ´¦ÀíÆðÀ´±È½Ï¼òµ¥£¬ËùÒÔWPFÀà¿â¾Í×Ô¼º°ïÎÒÃÇ×öÁË£¬µ«ÓÐЩÊý¾ÝÀàÐÍת»»¾Í²»ÊÇWPFÄܰïÎÒÃÇ×öµÄÁË£¬ÀýÈçÏÂÃæµÄÕâÖÖÇé¿ö£º
SourceÀïÃæµÄÖµÊÇY¡¢N¡¢XÈý¸öÖµ£¨¿ÉÄÜÊÇCharÀàÐÍ£¬stringÀàÐÍ»òÕß×Ô¶¨Òåö¾ÙÀàÐÍ£©£¬UIÉ϶ÔÓ¦µÄÊÇCheckBox¿Ø¼þ£¬ÐèÒª°ÑÕâÈý¸öÖµÓ³ÉäΪËüµÄIsCheckedÊôÐÔÖµ£¨boolÀàÐÍ£©¡£
µ±TextBoxÀïÃæ±ØÐëÊäÈëµÄÓÐÀàÈÝʱºòÓÃÓڵǼµÄButton²Å»á³öÏÖ£¬ÕâÊÇstringÀàÐÍÓëVisibilityö¾ÙÀàÐÍ»òboolÀàÐÍÖ®¼äµÄת»»£¨BindingµÄModel½«ÊÇoneway£©¡£
SourceÀïÃæµÄÖµÓпÉÄÜÊÇMale»òFeMale£¨string»òö¾Ù£©£¬UIÊÇÓÃÓÚÏÔʾͼƬµÄImage¿Ø¼þ£¬ÕâʱºòÐèÒª°ÑSourceÀïÃæÖµ×ª»»Îª¶ÔÓ¦µÄÍ·ÏñͼƬURI£¨ÒàÊÇoneway£©¡£
µ±Óöµ½ÕâЩÇé¿ö£¬ÎÒÃÇÖ»ÄÜ×Ô¼º¶¯ÊÖдConverter£¬·½·¨ÊÇ´´½¨Ò»¸öÀಢÈÃÕâ¸öÀàʵÏÖIValueConverter½Ó¿Ú£¬IValueConverter¶¨ÒåÈçÏ£º
public interface IValueConverter { object Convert(object value, Type targetType, object parameters, CultureInfo culture); object ConvertBack(object value, Type targetType, object parameters, CultureInfo culture); } |
µ±Êý¾Ý´ÓBindingµÄSourceÁ÷ÏòTargetµÄʱºò£¬Convert·½·¨½«±»µ÷Óã»·´Ö®ConvertBack½«±»µ÷Óá£ÕâÁ½¸ö·½·¨µÄ²ÎÊýÁбíһģһÑù£ºµÚÒ»¸ö²ÎÊýΪObject¡£×î´óÏ޶ȵı£Ö¤ÁËConvertµÄÖØÒªÐÔ¡£µÚ¶þ¸ö²ÎÊýÓÃÓÚÈ·¶¨·µ»Ø²ÎÊýµÄ·µ»ØÀàÐÍ¡£µÚÈý¸ö²ÎÊýΪÁ˽«¶îÍâµÄ²ÎÊý´«Èë·½·¨£¬ÈôÐèÒª´«µÝ¶à¸öÐÅÏ¢£¬ÔòÐèÒª½«ÐÅÏ¢×öΪһ¸ö¼¯ºÏ´«Èë¼´¿É¡£
Binding¶ÔÏóµÄModeÊôÐÔ½«Ó°ÏìÕâÁ½¸ö·½·¨µÄµ÷Óã»Èç¹ûModeΪTwoWay»òDefaultÐÐΪÓëTwoWayÒ»ÖÂÔòÁ½¸ö·½·¨¶¼ÓпÉÄܱ»µ÷Óá£Èç¹ûModeÊÇOneWay»òÕßDefaultÐÐΪÓëOneWayÒ»ÖÂÔòÖ»ÓÐConvert·½·¨»á±»µ÷Óá£ÆäËüÇé¿öͬÀí¡£
ÏÂÃæÕâ¸öÀý×ÓÊÇÒ»¸öConverterµÄ×ÛºÏʵÀý£¬³ÌÐòµÄÓÃ;ÊÇÏòÍæ¼ÒÏÔʾһЩ¾üÓ÷ɻúµÄ״̬ÐÅÏ¢¡£
Ê×ÏÈ´´½¨¼¸¸ö×Ô¶¨ÒåÊý¾ÝÀàÐÍ£º
public enum Category { Bomber, Fighter } public enum State { Available, Locked, Unknown } public class Plane { public Category category { get; set; } public State state { get; set; } public string name { get; set; } } |
ÔÚUIÀCategoryµÄ״̬±»Ó³ÉäΪͼ±ê£¬ÕâÁ½¸öͼ±êÒѾ±»ÎÒ·ÅÈëÏîÄ¿ÖУ¬Èçͼ£º

ͬʱ·É»úµÄStateÊôÐÔÔÚUIÀïÃæ±»Ó³ÉäΪCheckBox¡£ÒòΪ´æÔÚÒÔÉÏÁ½ÖÖÓ³Éä¹ØÏµ¡£ÎÒÃÇÐèÒªÌṩÁ½¸öConverter£ºÒ»¸öÓÐCategroyÀàÐ͵¥Ïòת»»ÎªstringÀàÐÍ£¨XAML»á°Ñstring½âÎöΪͼƬ×ÊÔ´£©£¬ÁíÒ»¸öÊÇStateºÍboolÀàÐÍÖ±½ÓµÄË«Ïòת»»¡£´úÂëÈçÏ£º
public class CategoryToSourceConverter:IValueConverter { public object Convert(object value, Type targetType, object parameters, System.Globalization.CultureInfo culture) { Category category = (Category)value; switch (category) { case Category.Bomber: return @"ICONS/Bomber.png"; case Category.Fighter: return @"ICONS/Fighter.png"; default: return null; } } public object ConvertBack(object value, Type targetType, object parameters, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } |
public class StateToNullableBoolConverter:IValueConverter { public object Convert(object value, Type targetType, object parameters, System.Globalization.CultureInfo culture) { State state = (State)value; switch (state) { case State.Available: return true; case State.Locked: return false; case State.Unknown: default: return null; } } public object ConvertBack(object value, Type targetType, object parameters, System.Globalization.CultureInfo culture) { bool? nb = (bool?)value; switch (nb) { case true: return State.Available; case false: return State.Locked; case null: default: return State.Unknown; } } } |
ÏÂÃæÎÒÃÇÀ´¿´¿´ÈçºÎÔÚXAML´úÂëÀïÃæÀ´Ïû·ÑÕâЩConverter£º
<Window x:Class="WpfApplication1.Window17" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1.BLL" Title="Window17" Height="327" Width="460"> <Window.Resources> <local:CategoryToSourceConverter x:Key="cts" /> <local:StateToNullableBoolConverter x:Key="snb" /> </Window.Resources> <StackPanel Name="stackPanel1" Background="AliceBlue" Margin="10"> <ListBox Name="listBox1" Height="160" Margin="5"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Image Height="16" Name="image1" Stretch="Fill" Width="16"
Source="{Binding Path=category,Converter={StaticResource cts}}"/> <TextBlock Height="23" Name="textBlock1"
Text="{Binding name}" Margin="8,0" Width="80"/> <CheckBox Height="16" Name="checkBox1"
IsChecked="{Binding Path=state,Converter={StaticResource snb}}" IsThreeState="True"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Button Content="Load" Height="23" Name="button1" Width="131" Margin="5" Click="button1_Click" /> <Button Content="Save" Height="23" Name="button2" Width="131" Margin="5" Click="button2_Click" /> </StackPanel> </Window> |
Load°´Å¥µÄʼþ´¦ÀíÆ÷¸ºÔð°ÑÒ»×é·É»úµÄÊý¾Ý¸³Öµ¸øListBoxµÄItemSourceÊôÐÔ£¬SaveµÄClickʼþ¸ºÔð°ÑÓû§Ð޸ĹýµÄÊý¾ÝдÈëÎļþ£º
/// <summary> /// Load°´Å¥Ê¼þ´¦ÀíÆ÷ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, RoutedEventArgs e) { List<Plane> infos = new List<Plane>() { new Plane(){ category= Category.Bomber,name="B-1", state= State.Unknown}, new Plane(){ category= Category.Bomber,name="B-2", state= State.Unknown}, new Plane(){ category= Category.Fighter,name="F-22", state= State.Locked}, new Plane(){ category= Category.Fighter,name="Su-47", state= State.Unknown}, new Plane(){ category= Category.Bomber,name="B-52", state= State.Available}, new Plane(){ category= Category.Fighter,name="J-10", state= State.Unknown}, }; this.listBox1.ItemsSource = infos; } /// <summary> /// Save°´Å¥Ê¼þ´¦ÀíÆ÷ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, RoutedEventArgs e) { StringBuilder sb = new StringBuilder(); foreach (Plane item in listBox1.Items) { sb.AppendLine(string.Format("Categroy={0},State={1},Name={2}",item.category,item.state,item.name)); } File.WriteAllText(@"D:\PlaneList.text",sb.ToString()); } |
ÔËÐгÌÐò£¬µ¥»÷CheckBoxÐ޸ķɻúµÄState£¬Èçͼ£º


µ¥»÷Saveºó´ò¿ªD:\\PlaneList.textÊý¾ÝÈçÏÂͼ£º

1.5 MultiBinding(¶à·Binding)
ÓÐʱºòUIÐèÒªÏÔʾµÄÊý¾ÝÀ´Ô´²»Ö¹Ò»¸öÊý¾ÝÀ´Ô´¾ö¶¨£¬Õâ¸öʱºò¾ÍÐèÒªÓõ½MultiBinding£¬¼´¶à·°ó¶¨¡£MultiBindingÓëBindingÒ»Ñù¾ùÒÔBindingBaseΪ»ùÀ࣬Ҳ¾ÍÊÇ˵£¬·²ÊÇÄÜÓÃBindingµÄ³¡ºÏ¶¼ÄÜʹÓÃMultiBinding¡£MutiBinding¾ßÓÐÒ»¸öBindingsµÄÊôÐÔ£¬ÆäÀàÐÍÊÇConnection<BindingBase>£¬Í¨¹ýÕâ¸öÊôÐÔ,MultiBinding°ÑÒ»×éBinding¶ÔÏó¾ÛºÏÆðÀ´£¬´¦ÔÚÕâ¸öBinding½áºÏÖеĶÔÏó¿ÉÒÔÓµÓÐ×Ô¼ºµÄÊý¾ÝУÑéºÍת»»»úÖÆ¡£ËüÃǻ㼯ÆðÀ´µÄÊý¾Ý½«¹²Í¬¾ö¶¨´«ÍùMultiBindingÄ¿±êµÄÊý¾Ý¡£ÈçÏÂͼ£º

¿¼ÂÇÕâÑùÒ»¸öÐèÇó£¬ÓÐÒ»¸öÓÃÓÚÐÂÓû§×¢²áµÄUI£¨4¸öTextBoxºÍÒ»¸öButton£©£¬»¹ÓÐÈçÏÂһЩÏÞ¶¨£º
µÚÒ»£¬¶þ¸öTextBoxÓÃÓÚÊäÈëÓû§Ãû£¬ÒªÇóÊý¾Ý±ØÐëÒ»Ö¡£
µÚÈý£¬ËĸöTextBoxÓÃÓÚÏÔʾÊäÈëµÄÓÊÏ䣬ҪÇóÊý¾Ý±ØÐëÒ»Ö¡£
µ±TextBoxµÄÄÚÈÝÈ«²¿·ûºÏÒªÇóµÄʱºò£¬Button¿ÉÓá£
´ËUIµÄXAML´úÂëÈçÏ£º
<Window x:Class="WpfApplication1.Window18" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window18" Height="300" Width="300"> <StackPanel Name="stackPanel1" Margin="10" Background="AliceBlue"> <TextBox Height="23" Name="textBox1" Margin="5" /> <TextBox Height="23" Name="textBox2" Margin="5" /> <TextBox Height="23" Name="textBox3" Margin="5" /> <TextBox Height="23" Name="textBox4" Margin="5" /> <Button Content="Regist" Height="23" Name="btnSubmit" Width="75" Margin="10"/> </StackPanel> </Window> |
ºǫ́´úÂëÈçÏ£º
public Window18() { InitializeComponent(); SetBinding(); } private void SetBinding() { //×¼±¸»ù´¡Binding Binding bind1 = new Binding("Text") { Source=textBox1}; Binding bind2 = new Binding("Text") { Source = textBox2 }; Binding bind3 = new Binding("Text") { Source = textBox3 }; Binding bind4 = new Binding("Text") { Source = textBox4 }; //×¼±¸MultiBinding MultiBinding mb = new MultiBinding() { Mode= BindingMode.OneWay}; mb.Bindings.Add(bind1);//×¢Ò⣬MultiBinding¶Ô×ÓÔªËØµÄ˳ÐòÊǺÜÃô¸ÐµÄ¡£ mb.Bindings.Add(bind2); mb.Bindings.Add(bind3); mb.Bindings.Add(bind4); mb.Converter = new MultiBindingConverter(); ///½«BindingºÍMultyBinding¹ØÁª this.btnSubmit.SetBinding(Button.IsVisibleProperty, mb); } |
×¢Ò⣺
MultiBinding¶Ô×ÓÔªËØµÄ˳Ðò·Ç³£Ãô¸Ð£¬ÒòΪÕâ¸öÊý¾Ý¾ö¶¨Á˻㼯µ½ConvertÀïÊý¾ÝµÄ˳Ðò¡£
MultiBindingµÄConverterʵÏÖµÄÊÇIMultiValueConverter¡£
±¾ÀýµÄConverter´úÂëÈçÏ£º
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Data; namespace WpfApplication1.BLL { public class MultiBindingConverter:IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if(!values.Cast<string>().Any(text=>string.IsNullOrEmpty(text))
&&values[0].ToString()==values[1].ToString()&&values[3].ToString()==values[4].ToString()) { return true; } return false; } /// <summary> /// ¸Ã·½·¨²»»á±»µ÷Óà /// </summary> /// <param name="value"></param> /// <param name="targetTypes"></param> /// <param name="parameter"></param> /// <param name="culture"></param> /// <returns></returns> public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } } |
³ÌÐòÔËÐÐЧ¹ûÈçͼ£º
 
С½á£º
WPFµÄºËÐÄÀíÄîÊDZ䴫ͳµÄUIÇý¶¯Êý¾Ý±ä³ÉÊý¾ÝÇý¶¯UI£¬Ö§³ÅÕâ¸öÀíÄîµÄ»ù´¡¾ÍÊDZ¾Õ½²µÄData
BindingºÍÓëÖ®Ïà¹ØµÄÊý¾ÝУÑéºÍÊý¾Ýת»»¡£ÔÚʹÓÃBindingµÄʱºò£¬×îÖØÒªµÄ¾ÍÊÇÉèÖÃËüµÄÔ´ºÍ·¾¶¡£
|