WPF之Binding

  • Bingding是什么

  WPF中的Binding注重表达的是一种像桥梁一样的关系,它的两段分别是Binding的源(Source)和目标(Target)。数据从哪里来哪里就是源,Binding是架在中间的桥梁,Binding的目标是数据要往哪去儿。一般情况下,Binding源是逻辑层的对象,Binging的目标是UI层的控件对象。

  • Binding如何传递数据变化

  前面说过数据源是一个对象,但一个对象身上可能有很多数据,这些数据又通过属性暴露给外界。其中你想通过Binding送达UI元素的数据,或者说UI元素关心的那个属性被称为Binding的路径(Path)。

  Binding是一中自动机制,当属性值发生变化后,属性要有能力通知Binding,让Binding把变化传递给UI元素。这种能力的实现就是通过在属性的set语句中触发一个PropertyChanged事件。因此数据源要继承接口INotifyPropertyChanged,当为Binding设定了数据源后,Binding会自动侦听来自这个接口的PropertyChanged事件。

  现在我们抽象一个类Car,但我们只关心他的价格,声明如下:

public class Car:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private Int32 price;

        public Int32 Price
        {
            get { return price; }
            set
            {
                if (value != price)
                {
                    price = value;
                    if (PropertyChanged != null)
                    {
                        this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Price"));
                    }
                }
            }
        }
    }

  然后我们在窗体上创建一个TextBox和Button。TextBox显示Car的Price,将作为Binding的目标,窗体代码如下:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Simple Binding" Height="150" Width="300">
    <StackPanel>
        <TextBox x:Name="txtName" TextWrapping="Wrap" Text="TextBox" Margin="5" Height="27"/>
        <Button Content="降价10%"   Click="Button_Click" Margin="5" Height="31"/>
    </StackPanel>
</Window>

  接下来我们在窗体的构造函数里使用Binding把数据源和UI元素链接起来,代码如下:

public partial class MainWindow : Window
    {
        Car myCar;
        public MainWindow()
        {
            InitializeComponent();
            //准备数据源
            myCar= new Car();
            //准备Binding
            Binding binding = new Binding();
            binding.Source = myCar;
            binding.Path = new PropertyPath("Price");
            //使用Binding链接数据源与Binding目标
            BindingOperations.SetBinding(this.txtName, TextBox.TextProperty, binding);
        }
    }

  根据Binding类的构造函数以及C#的对象初始化器语法来简化代码,代码如下:

this.txtName.SetBinding(TextBox.TextProperty, new Binding("Price") { Source = myCar = new Car() });

  在Button的Click事件中改变属性Price的值,每点一次,Car的Price减少10%,代码如下:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            myCar.Price = myCar.Price / 10;
        }

时间: 2024-10-14 05:28:38

WPF之Binding的相关文章

【转载一篇WPF之Binding】WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去改动,复用性也很高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定量的

WPF - Conditional binding with trigger

/* By Dylan SUN*/ WPF conditional binding enables the application to have different behaviors based on a pre-defined condition. For example, you could use conditional binding to change the background color of your WPF application main window. Suppose

WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都非常重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去修改,复用性也非常高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定

WPF之Binding【转】

WPF之Binding[转] 看到WPF如此之炫,也想用用,可是一点也不会呀. 从需求谈起吧: 首先可能要做一个很炫的界面.见MaterialDesignInXAMLToolKit. 那,最主要的呢,还是想显示数据. 就先来数据,数据可以从数据库里得到,可是如何显示出来呢? 本文的主角出来了:(以下内容全转载他人,具体 原文见上面的链接) ==================================== 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.

【转】WPF中Binding的技巧(一)

WPF中Binding的技巧(一) 在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. source = {binding} 和source = {binding RelativeSource={RelativeSource self},Path=DataContext}效果相同 理解:{binding} 不设定明确的绑定的source,这样bindin

WPF之Binding对数据的转换(第五天)

Binding在Slider控件与TextBox控件之间建立关联,值可以互相绑定,但是它们的数据类型是不同的,Slider是Double类型,Text为String.原来,Binding有一种机制称为数据转换(Data Converter),当数据绑定的源与目标不同类型时,处理比较简单时,系统就自动的进行了类型转换,但是对于相对复杂的类型转换时,就需要我们手动进行了. 下面用一个例子来说明Convert的应用,程序的用途是在列表里面向玩家显示一些球的状态. 首先创建几个自定义数据类型: publ

WPF Data Binding之数据的转换和校验【四】

Binding的作用就是架在Source和Target之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实社会中桥梁需要设置安检和关卡一样,Binding这座桥上也可以设置关卡对数据进行验证,不仅如此,如果Binding两端需要不同的数据类型的时候我们还可以为数据设置转换器. Binding用于数据有效性校验的关卡是他的ValidationRules属性,用于数据类型转换的关卡是它的Convert属性. 1.1 Binding的数据校验 Binding的ValidationRules属性是Co

WPF Data Binding之地位与基础【一】

[1]Data Binding在WPF中的地位 从传统的Winform转移到WPF上,对于一个三层程序而言,数据存储层由数据库和文件系统组成,数据传输和处理仍然使用.NetFramework的ADO.NET等基本类(与Winform开发一样).展示层则使用WPF类库来实现,而展示层和逻辑层的沟通就使用Data Binding来实现.可见,Data Binding在WPF中所起的作用就是高速公路的作用.有了这条高速公路,加工好的数据自动送达用户界面并加以显示,被用户修改过的数据也会自动传回业务逻辑

[原创]WPF资源Binding自定义集合类。

简单介绍一下Wpf资源字典: 每个WPF界面元素都有一个名为Resource的属性,这个属性继承至FrameworkElement类,其类型为ResourceDictionary.ResourceDictionary能够以键值对的形式存储资源,当要使用到某个资源的时候,使用键值对的形式获取资源对象.在保存资源时,ResourceDictionary视资源对象为Object类型,所以再使用资源时先要对资源对象进行类型转换,XAML编译器能够根据Attribute自动识别资源类型,如果类型不对就会抛