自学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的绑定。

posted @ 2017-12-26 18:08  pretty_girl  阅读(414)  评论(0编辑  收藏  举报