自学WPF之Binding(二)
- 没有Source的Binding,使用ContentText作为Binding源:
上一篇是把CLR类型对象当作指定为Binding的Source,两种方法:一是把对象赋值给Binding.Source属性或者把对象的Name赋值给Binding.ElementNam。DataContext属性被定义在FrameworkElement类里,这个类是WPF控件的基类。下面是一个实例:
<Window x:Class="MyFirstWPFTest.BindingPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:MyFirstWPFTest" Title="BindingPage" Height="300" Width="300"> <StackPanel Background="LightBlue"> <StackPanel.DataContext> <local:Employee Id="5" Age="24" Name="张三"/> </StackPanel.DataContext> <TextBox Text="{Binding Path=Id}" Margin="5"/> <TextBox Text="{Binding Path=Age}" Margin="5"/> <TextBox Text="{Binding Path=Name}" Margin="5"/> <StackPanel /> <Window/>
使用 xmlns:local="clr-namespace:MyFirstWPFTest" ,就可以在xmal代码中使用Employee,因为外层的StackPanel的DataContext进行了赋值,是一个Employee对象。三个文本框通过Binding获取值,因为只有path没有指定Source,所以path可以省略。这样通过path就会自动向UI元素上层搜索(实际是因为DataContext是一个依赖属性,当没有为其显式赋值时,控件会把容器的属性当作自己的属性,往下传递。),最终找到path指定的元素。
效果图;
DataConcent用法非常灵活,比如(1)当UI上多个控件都使用Binding都关注同一个对象时,可以用DataContext。(2)当作为Source对象不能直接被访问时,比如窗体B的控件想Binding窗体A内的控件的Source,而窗体A的Source是Private访问级别的时候,就可以把这个控件作为窗体A的DataContext暴露出来。
- 使用集合对象作为列表控件的ItemsSource
WPF中的列表控件派生自ItemsControl类,(继承ItemsSource这个属性),ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都实现了这个接口)ItemsSource里面放的是一条一条的数据。下面看一个实例:
<TreeView Height="121" Name="treeView1" Width="186" HorizontalContentAlignment="Left" HorizontalAlignment="Left" ItemsSource="{Binding}" DataContext="{Binding}"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter> </Style> </TreeView.ItemContainerStyle> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"> <StackPanel Orientation="Horizontal"> <TextBlock VerticalAlignment="Center" Name="nodeName" Text="{Binding Age}"></TextBlock> <StackPanel.ToolTip> <TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap" MaxWidth="200" ></TextBlock> </StackPanel.ToolTip> </StackPanel> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>
C#代码如下:
List<Employee> list = new List<Employee>(2); for (int i = 0; i < 2; i++) { Employee em1 = new Employee(); em1.Age = i + 30; em1.Name = "刘" + i.ToString(); em1.Id = i; list.Add(em1); } this.treeView1.ItemsSource = list;
上一篇已经写了Employee类的定义,下面是运行结果:
在以后的笔记中会详细介绍TreeView和ListView的绑定。