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
原文地址:https://www.cnblogs.com/yijiaoyingbi/p/4841038.html