• Binding在WPF中的使用


    闲来无事,不想打DOTA,在这里小小研究下wpf中关于Binding的东西。

    咯咯


    在我们印象中,Binding的意思是“绑定”,这个“绑”大概取自于Bind这个单词吧,这么理解的话就是以音译英了,没什么实际意义。

    Bind这个单词的动词形式是Binding,看看字典就知道除了前面说的“捆绑”之外,还有“键联”,“关联”的意思。比如原子键联(atomic binding),化学键联(binding-beam)等。也就是说啦,Binding更注重于表达的是一种“关系”,而不是一个动作。如果把Binding比作数据的桥梁,那么它的两端分别是Binding的源(Source)和目标(Target)。它描述了数据从哪来到哪去,一般情况下Binding的源是逻辑层的对象,目标是表现层(UI)的控件对象,我们不但可以控制源与目标之间双向或者单向的道路,还可以控制对数据的放行机制。那么下面我来搞一个简单的例子。

    先做一个源数据,一个来自于逻辑层的对象

    class Student
    {
      private string name;
      public string Name
      {
         get{return name;}
         set{name = value;}
      }
    }

    属性是有了,可是我的目标完全不知道当我的属性发生变化时,源怎么通知我的目标,告诉它源数据变化了?所以,这样一个简单的类显然不科学。完善一下它,让它去继承

    System.ComponentModel下的INotifyPropertyChanged接口就行了

    那么完整的类应该是这个样子

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

    看,当为Binding设置了数据源之后,它会自动监听来自PropertyChanged这个接口的事件,Name发生变化,触发propertyChanged事件,Binding监听到了触发的事件,它会告诉UI层的控件Name这个属性的值发生变化,通知UI层控件显示新的值。

    有卖就有买,下面是它的目标控件

    <Window x:Class="Binding1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <TextBox x:Name="txtBoxName" BorderBrush="Black" Margin="5"></TextBox>
            <Button Content="AddAge" Margin="5" Click="Button_Click"></Button>
        </StackPanel>
    </Window>

    写了一个TextBox作为Binding的目标和一个按钮Button来触发改变Name值得事件。

    然后就是介绍他们俩认识的时候了。。。

    public partial class MainWindow : Window
        {
            Student stu;
            public MainWindow()
            {
                InitializeComponent();
    
                //准备数据源
                stu = new Student();
                //把stu.Name作为Binding的数据源
                Binding binding = new Binding();
                binding.Source = stu;
                binding.Path = new PropertyPath("Name");
                //使用Binding连接源和目标,把stu的Name属性值联系到一个叫做"txtBoxName"的TextBox上去
                BindingOperations.SetBinding(this.txtBoxName, TextBox.TextProperty, binding);
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                stu.Name += "屎兔子";
            }
        }

    运行效果

    当然,也可以把上面的代码这么写,借助Binding类构造器和C#3.0的对象初始化语法来简化代码

    public Window1()
    {
       InitializeComponent();
    this.txtBoxName.SetBinding(TextBox.TextProperty,new Binding("Name"){Source = stu = new Student()}); }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
                stu.Name += "屎兔子";
    }

    好了,一个简单的例子写到这里,明天继续详细学习。(下午下午媳妇一直问我那个疯狂猜图的答案,表示我也迷恋了,去玩会儿~)

  • 相关阅读:
    POJ 2689
    NEFU 109
    HDU 2098
    NEFU 2
    NEFU 117
    NEFU 84
    POJ 1061
    NEFU116 GCD
    NEFU 115
    HDU 2099
  • 原文地址:https://www.cnblogs.com/Mushrooms/p/3142559.html
Copyright © 2020-2023  润新知