WPF学习之Binding(一)

Binding

WPF的核心理念是传统的变UI驱动程序为数据驱动UI,支撑这个理念的基础就是Data Binding和与之相关的数据校验和转换。

使用Binding时,最重要的是准确设置它的源和路径。

Binding基础

Binding是数据的桥梁,两端分别是Source(源)和Target(目标)

例子:创建一个简单的数据源binding在UI元素上

创建数据源(student类)

class Student : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }
    }

在窗体上放一个TextBox和一个Button,TextBox为绑定对象

<StackPanel>
        <TextBox x:Name="textboxName"  BorderBrush="Black" Margin="5"/>
        <Button Content="Add Age" Margin="5" Click="Button_Click_1"/>
</StackPanel>

使用Binding把数据源和UI元素连接起来,C#代码如下:

 Student stu;
        public BD()
        {
            InitializeComponent();
            stu = new Student();
            Binding bd = new Binding();
            bd.Source = stu;
            bd.Path = new PropertyPath("Name");
            BindingOperations.SetBinding(this.textboxName, TextBox.TextProperty, bd);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            stu.Name += "Name";
        }

效果:

绑定模型:

Binding的源和路径

Binding的源也就是数据的源头,Binding对数据的源并不苛刻——只要它是一个对象,并且通过属性(Property)公开过自己的数据。它就能作为Binding的源。

大多数情况下Binding的源是逻辑层对象,但有时候为了让UI元素之间产生联动也会使用Binding在控件间建立关联。

下面是把TextBox的Text属性绑定在Slider的Value属性上,代码如下:

 <TextBox x:Name="textboxName" Text="{Binding Path=Value, ElementName=slider1}" BorderBrush="Black" Margin="5"/>
        <Slider x:Name="slider1" Maximum="100" Minimum="0" Margin="5"/>

效果:

控制Binding的方向及数据更新

绑定是源与目标沟通的桥梁,默认情况下数据既能通过Binding送达目标,目标也能通过绑定回源(收集用户对数据的修改)。

有时候数据需要展示给用户,不允许修改,这时候可以把Binding模式改我源向目标单向沟通。Binding还支持目标向源单向沟通以及只在Binding关系确定时只读取一次数据。

控制Binding数据流向的属性是Mode。BindingMode可取数据为:TwoWay、OneWay、OneTime、OneWayToSource、Default。

Default是指Binding的模式会根据目标实际情况来确定。比如可编辑的(TextBox.Text属性),就采取双向模式;只读(TextBlock.Text属性),就采取单向模式。

Binding的路径(Path)

Binding源的对象可能有很多属性,通过这些属性可以把数据暴露给外界。

Binding需要关注哪个属性由Path属性来决定。如把Slider控件对象作为源,Value属性作为路径。

当使用一个集合或者DataView作为Binding源时,把默认元素当做Path使用。C#代码如下:

 List<string> stringList = new List<string>() { "Tim", "Tom", "Blog" };
            this.textBox1.SetBinding(TextBox.TextProperty, new Binding("/") { Source = stringList });
            this.textBox2.SetBinding(TextBox.TextProperty, new Binding("/Length") { Source = stringList, Mode = BindingMode.OneWay });
            this.textBox3.SetBinding(TextBox.TextProperty, new Binding("/[2]") { Source = stringList, Mode = BindingMode.OneWay });

效果:

没有Source的Binding——使用DataContext作为binding的源

Binding只知道自己的Path而不知道Source时,会沿着UI元素树一路向树的根部找下去,每遇到一个节点都会看看这个节点的DataContext是否具有Path指点的属性。

如果有就把这个对象当成自己的Source,如果没有继续找下去。如果到根部还没有,这个binding就没有Source,因而看不到数据。

例子:XAML代码如下:

<StackPanel Background="LightBlue">
        <StackPanel.DataContext>
            <local:Student1 Id="3" Age="23" Name="Tim"/>

        </StackPanel.DataContext>
        <Grid>
            <StackPanel>
                <TextBox Text="{Binding Path=Id}" Margin="5"/>
                <TextBox Text="{Binding Path=Age}" Margin="5"/>
                <TextBox Text="{Binding Path=Name}" Margin="5"/>
                <TextBlock Text="{Binding}" Margin="5"/>
                <TextBlock Text="{Binding}" Margin="5"/>
                <TextBlock Text="{Binding}" Margin="5"/>
            </StackPanel>
        </Grid>
 </StackPanel>

效果:

时间: 2024-10-28 09:41:25

WPF学习之Binding(一)的相关文章

WPF学习之Binding(二)

前言: (一)里面简单学习了Binding的基础.源.路径.如何控制Binding的方向及数据更新.使用DataContext作为Binding的源等 使用集合对象作为列表控件的ItemSource WPF列表式控件派生自ItemControl类,自然继承了ItemSource这个属性. 例如:ListBox条目容器ListBoxItem,ComboBox条目容器ComboBoxItem. ItemSource里存着一条条数据,想要显示出来必须借助条目容器.Binging就是用来联系条目容器和数

WPF学习之Binding的学习(一)

程序的本质是数据加算法.通俗一点来说呢,其实就是用户给一个输入,经过算法的处理之后,计算机反馈一个输出给用户.可以很清楚的看出,在这个过程中,处于主导地位的是数据.但是,当我们在进行图形用户界面(Graphic User Interface,GUI)编程的时,数据总是处于被动地位.也就是说,程序总是在等待接收来自UI的消息/事件,在这些事件被处理之后,才会反馈给用户一个输出.我们用Data Binding可以在GUI编程时让数据回到程序的核心. **1.Data Binding在WPF中的地位*

WPF学习09:数据绑定之 Binding to List Data

从WPF学习03:Element Binding我们可以实现控件属性与控件属性的绑定. 从WPF学习07:MVVM 预备知识之数据绑定 我们可以实现控件属性与自定义对象属性的绑定. 而以上两个功能在实际应用中还是不够的,我们经常需要将列表数据与控件属性进行绑定. 例子 ListBox切换人物,下面两个文本框跟随切换,很常用的功能. XAML代码: <Window x:Class="DataTemplate.MainWindow" xmlns="http://schema

WPF学习------XAML 语法详述

XAML 语言规范 XAML 语言规范中也定义或引用了此处定义的 XAML 语法术语. XAML 是一种基于 XML 并遵循或扩展 XML 结构规则的语言. 其中某些术语共享自或基于描述 XML 语言或 XML 文档对象模型时常用的术语. 有关 XAML 语言规范的更多信息,请从 Microsoft 下载中心下载 [MS-XAML]. XAML 和 CLR XAML 是一种标记语言. 顾名思义,公共语言运行时 (CLR) 实现了运行时执行. XAML 本身并非 CLR 运行时直接使用的一种公共语

8 WPF学习之深入浅出话属性

转载:http://blog.csdn.net/fwj380891124/article/details/8131080 通过前面的学习,我们已经知道Data Binding是WPF"数据驱动UI"理念的基础.上一章我们将主要的精力放在了Binding的数据源这一端,研究了Binding的Source和Path.本章我们将把目光移向Binding的目标端,研究一下什么样的对象才能作为Binding的Target以及Binding将把数据送往何处. 1.1      属性(Propert

WPF学习10:基于MVVM Light 制作图形编辑工具(1)

图形编辑器的功能如下图所示: 除了MVVM Light 框架是一个新东西之外,本文所涉及内容之前的WPF学习0-9基本都有相关介绍. 本节中,将搭建编辑器的界面,搭建MVVM Light 框架的使用环境. 界面 <Window x:Class="GraphEditor.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http:

WPF学习07:MVVM 预备知识之数据绑定

MVVM是一种模式,而WPF的数据绑定机制是一种WPF内建的功能集,两者是不相关的. 但是,借助WPF各种内建功能集,如数据绑定.命令.数据模板,我们可以高效的在WPF上实现MVVM.因此,我们需要对各种MVVM相关的WPF内建功能集进行了解,才能在扎实的基础上对MVVM进行学习与实践. 本文是WPF学习03:Element Binding的后续,将说明实现数据绑定的三个重点:DataContext INotifyPropertyChanged IValueConverter MVVM简介 MV

命令——WPF学习之深入浅出

WPF学习之深入浅出话命令 WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”.事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于如何响应事件送来的消息事件并不做任何限制,每个接收者可已用自己的行为来响应事件.也就是说,事件不具有约束力.命令和事件的区别就在于命令具有约束力. 的确,在实际编程工作中,即使只用事件不用命令程序的逻辑一样被驱动的很好,但我们不能够阻止程序员按照自己的习惯去编写代码.比如保存事件的处理器,程序员可以写S

WPF学习08:MVVM 预备知识之COMMAND

WPF内建的COMMAND是GOF 提出的23种设计模式中,命令模式的实现. 本文是WPF学习07:MVVM 预备知识之数据绑定的后续,将说明实现COMMAND的三个重点:ICommand  CommandManager InputBindings COMMAND简介 一般情况我们应用设计如下,一个个控件的各类Handler直接关心了如何实现具体的应用逻辑. 借助COMMAND,我们将具体实现的应用逻辑放在COMMAND中实现,控件只需要绑定相应的COMMAND,而无需关心应用逻辑,从而实现界面