zoukankan      html  css  js  c++  java
  • 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"));
                        }
                    }
                }
            }        
        }
    View Code

      然后我们在窗体上创建一个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>
    View Code

      接下来我们在窗体的构造函数里使用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);
            }       
        }
    View Code

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

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

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

    private void Button_Click(object sender, RoutedEventArgs e)
            {
                myCar.Price = myCar.Price / 10;
            }
    View Code
  • 相关阅读:
    Vue入门系列(四)之Vue事件处理
    Vue入门系列(五)Vue实例详解与生命周期
    微信为啥不能直接下载.apk安装包
    Oracle行转列SQL
    MyISAM 和InnoDB区别
    jQuery easyui datagrid数据绑定
    js调用百度地图API创建地图,搜索位置
    python tornado框架使用
    python数据库连接池
    python操作数据库
  • 原文地址:https://www.cnblogs.com/yijiaoyingbi/p/4841038.html
Copyright © 2011-2022 走看看