WPF感悟(2)——XAML与C#的语法不对称
XAML的语法与C#的语法并不是完全对称的,最明显的就是在设置Binding的时候。
XAML:
<ListBox Name="listBox1" ItemsSource="{Binding ...}" .../>
如何看待ItemsSource="{Binding ...}这个attribute?如果认为是
listBox1.ItemsSource = new Binding(...);,那就错了——数据类型都不匹配。实际上,这句XAML对应的C#应该是:
listBox1.SetBinding(ListBox.ItemsSourceProperty, new Binding(...));
为了让Binding更详细,往往把它拎出来写,成为这样:
Binding b = new Binding("Path");
b.Source = XXXX;
listBox1.SetBinding(ListBox.ItemsSourceProperty, b);
===========================================================
补记一点东西:
特别是对于DataContext这个东西——
something.DataContext = aDataSource;
与
something.SetBinding(DataContextProperty, aBinding);
是完全不一样的(当然不一样!只是工作的时候容易搞混)。前者是设定一个对象的DataContext后,这个DataContext就不变了(是哪个对象就不变了,并不是说这个对象内的内容不变);后者是说这个对象的DataContext借助一个Binding来改变。