Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
WPFÖ®BindingÉîÈë̽ÌÖ
 
×÷ÕߣºDarrenF À´Ô´£ºCSDN ·¢²¼ÓÚ£º2015-9-18
  4218  次浏览      29
 

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µÄʱºò£¬×îÖØÒªµÄ¾ÍÊÇÉèÖÃËüµÄÔ´ºÍ·¾¶¡£

   
4218 ´Îä¯ÀÀ       29
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ

.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield

ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹