深入浅出WPF之Binding--笔记(2015.03.02)

Binding

DataContext属性被定义在FrameworkElement类里,这个类是WPF的基类,这意味着所有WPF控件都具备这个属性。在UI树上,每个结点都有DataContext。当一个Binding只知道Path而不知道Source时,会沿着UI树一路向树的根部找过去,每路过一个结点就查看该结点的DataContext是否具有Path所指定的属性。若有,那就把该对象作为自己的Source,否则继续找下去。如果到了树的根部还没有找到,那该Binding就没有Source,因而不会得到数据。事例如下:

XAML:

<StackPanel Background="LightBlue">
        <StackPanel.DataContext>
            <local:Student Id="6" Name="Tim" Age="29"/>
        </StackPanel.DataContext>
        <Grid>
            <StackPanel>
                <TextBox Text="{Binding Id}" Margin="5"/>
                <TextBox Text="{Binding Name}" Margin="5"/>
                <TextBox Text="{Binding Age}" Margin="5"/>
            </StackPanel>
        </Grid>
    </StackPanel>

C#代码:

public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

/// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

由于Path也可省略成“.”,故有如下代码:

<StackPanel Background="LightBlue">
        <StackPanel.DataContext>
            <sys:String>Hello DataContext!</sys:String>
        </StackPanel.DataContext>
        <Grid>
            <StackPanel>
                <TextBox Text="{Binding .}" Margin="5"/>
                <TextBox Text="{Binding .}" Margin="5"/>
                <TextBox Text="{Binding .}" Margin="5"/>
            </StackPanel>
        </Grid>
    </StackPanel>

DataContext是一个“依赖属性”,依赖属性有一个很重要的特点就是当没有为控件的某个依赖属性显示赋值时,控件就会把自己容器的属性值当作自己的属性值,实际上是属性值沿着UI元素树向下传递了。如下:

<Grid Background="LightBlue" DataContext="6">
        <Grid>
            <Grid>
                <Grid>
                    <Button x:Name="btn" Content="OK" Click="btn_Click"/>
                </Grid>
            </Grid>
        </Grid>
    </Grid>

C#代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

private void btn_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(btn.DataContext.ToString());
        }
    }

WPF中的列表式控件均派生自ItemsCotrol类,都继承了ItemsSource属性,该属性可接收一个IEnumerable接口派生类的实例作为自己的值。每个ItemsControl的派生类都具有自己对应的条目容器。ItemsSource里存放的是一条一条的数据,要想把数据显示出来就需要为它们穿上“外衣”,条目容器就起到数据外衣的作用。只要为一个ItemsControl对象设置了ItemsSource属性值,ItemsControl对象就会自动迭代其中的数据元素,为每个数据元素准备一个条目容器,并使用Binding在条目容器与数据元素之间建立起关联。如下:

XAML:

<StackPanel x:Name="stackPanel" Background="LightBlue">
        <TextBlock Text="Student ID:" FontWeight="Bold" Margin="5"/>
        <TextBox x:Name="textBoxId" Margin="5"/>
        <TextBlock Text="Student List:" FontWeight="Bold" Margin="5"/>
        <ListBox x:Name="listBoxStudents" Height="110" Margin="5"/>
    </StackPanel>

C#代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

List<Student> stuList = new List<Student>
            {
                new Student {Id = 1, Name = "Tom", Age = 20},
                new Student {Id = 2, Name = "Tim", Age = 21},
                new Student {Id = 3, Name = "Bruce", Age = 22}
            };

this.listBoxStudents.ItemsSource = stuList;
            this.listBoxStudents.DisplayMemberPath = "Name";

this.textBoxId.SetBinding(TextBox.TextProperty, new Binding("SelectedItem.Id") { Source = this.listBoxStudents });
        }
    }

时间: 2024-10-12 17:11:19

深入浅出WPF之Binding--笔记(2015.03.02)的相关文章

深入浅出WPF之Binding -- 笔记(2015.03.01)

当使用一个集合或DataView作为Binding的源时,如果想把它的默认元素当作Path使用,则需要使用"/"语法:如果集合元素的属性仍然还是一个集合,又想把子级集合中的元素当作Path,则可以使用多级斜线的语法(即一路"斜线"下去): 事例一: XAML: <StackPanel>        <TextBox x:Name="textBox1" BorderBrush="Black" Margin=&

深入浅出WPF之Binding--笔记(2015.03.04)

XML语言可以方便地表示树形数据结构.HierarchicalDataTemplate类表示一个 DataTemplate,它支持 HeaderedItemsControl,比如 TreeViewItem 或 MenuItem. XAML: <Window.Resources>        <XmlDataProvider x:Key="xdp" XPath="FileSystem/Folder">            <x:XDa

深入浅出WPF之Binding--笔记(2015.03.03)

将上篇的this.listBoxStudents.DisplayMemberPath = "Name";注释.然后XAML代码改为: <StackPanel x:Name="stackPanel" Background="LightBlue">        <TextBlock Text="Student ID:" FontWeight="Bold" Margin="5&quo

深入浅出WPF之MultiBinding--笔记(2015.03.10)

当UI需要显示的信息由不止一个数据来源决定,此时需要使用MultiBinding,即多路Binding.MultiBinding与Binding都以BindingBase为基类,也就是说,凡是能使用Binding对象的场合都能使用MultiBinding.MultiBinding具有一个名为Bindings的属性,其类型是Collection<BindingBase>,通过这个属性MultiBinding把一组Binding对象聚合起来,处在该集合中的Binding对象都可以拥有自己的数据校验

深入浅出WPF之Binding--笔记(2015.03.08)

C#代码: RelativeSource rs = new RelativeSource();    rs.AncestorLevel = 2;    rs.AncestorType = typeof(DockPanel);    Binding binding = new Binding("Name") { RelativeSource = rs };    this.textBox1.SetBinding(TextBox.TextProperty, binding); 或在XAML

深入浅出WPF之Binding--笔记(2015.03.06)

ObjectDataProvider就是把对象作为数据源提供给Binding.同XmlDataProvider的父类都是DataSourceProvider抽象类. 事例一: XAML: <Grid Background="LightBlue">        <Button Click="Button_Click"/>    </Grid> C#代码: private void Button_Click(object sende

《深入浅出WPF》 学习笔记

<深入浅出WPF> 序言 1. 什么是WPF    2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新建WPF项目 2. 剖析最简单的XAML代码 第三章 系统学习XAML语法 1. XAML文档的树形结构 2. XAML中为对象属性赋值的语法 2.1 使用标签的Attribute为对象属性赋值 2.2 使用TypeConverter 2.3 属性元素 2.4 标记扩展(Markup Extensions)

《深入浅出WPF》学习笔记之深入浅出话Binding

Binding作为数据的桥梁,它的两端分别是Binding的源(Source)和目标(Target),用来把Source中的数据送到Target中,并把在Target中的改变返回到Source.一般情况,Binding的源是逻辑层的对象,目标是UI层的控件对象. Binding的基本使用方法 如果想让作为数据源的对象在发生更改时自动显示到界面上,数据源的对象需要实现INotifyPropertyChanged接口.设置绑定时需要指定绑定到数据源的哪个属性,这个属性称为Binding的路径Path

《深入浅出WPF》学习笔记之系统学习XAML语法

XAML是WPF技术中专门用于设计UI的语言,设计师直接使用XAML设计界面,设计完成后输出XAML代码交给程序员直接使用. XAML是一种由XML派生而来的语言,所以会继承XML中的一些概念. 命名空间: 命名空间为避免标签的名称冲突而出现,可以把来自不同程序集中的类映射到自定义的命名空间前缀,使用语法xmlns[:可选的映射前缀]="名称空间和程序集".没有映射前缀的命名空间为默认命名空间,默认命名空间只能有一个.命名空间映射一般写在根标签上. 标签与运行时对象的关系: 在XAML