zoukankan      html  css  js  c++  java
  • WPF 神话之Binding对象一

    这里的Binding从字面上的意思就是数据绑定。
    今天我不想写太多的东西。因为今晚还有许多东西要做。所以今天就一起探讨一个问题——Binding的使用问题。
    第一点:Binding可以称作为数据的管道。两头分别是数据源,数据对象。也就是Source--->Target.源和对象
    之间有时候可以使单向的,有时候可以使双向的。这里的设定可以使用Mode对象。他是一个枚举。有四个属性值。
    大家可以查看相关文档。在接下来的例子中,我们也会看到。
    第二点:Binding对象。也就是说。我们把我的一个源中的什么属性交给Target。我们可以设置Binding中的Path
    来告诉我们的程序。我们是把那个对象给我们的Target。
    第三点:在第一点中我们说过,Binding可以使双向的。那么数据改变的时候。在什么场合会进行更新源。或者
    更新Target了。这里又要牵扯到一个新的东西就是触发器。通过设置UpdateSourceTrigger这个属性来设定触发的
    时机。
    以上都是些无聊的说明性东西。只是让大家知道,我们接下来的例子中要用到什么知识点。
    好了。我们看第一个例子(因为上传图片比较麻烦,所以这里我就不上传图片了。感兴趣的可以把代码照抄一遍
    自己去试验下,我觉得这样印象更好)
    我们来看下面的一个例子:
    我先来说说这里例子要做什么,这个例子是这样的。在窗口上一个文本框,一个按钮。文本框呈现的是一个对象
    的某个属性。点击按钮,改变文本的绑定源的数据。同时更新文本信息。
    大家看了这点,一定觉得这个很好实现。我们只要把源拿到,更改后,重新赋给我们的控件就好了。这个是可行
    的,但不是我们今天要说的。
    好了我们来分析下。
    第一个需求很简单。只是把某个对象给控件。但是第二个需求了?首先要知道我们的Binding是很智能的。只要源
    的数据一旦发生了改变。目标显示也会改变。怎么来改变了,肯定有个事件去监听着,我们的源数据。那么这个监
    听是什么了,我们要如何来写了。
    请看我定义的一个类:
    namespace WpfBinding
    {
    /*
    * 1、首先使用属性通知接口(INoticePropertyChanged)
    * 2、该接口中只有一个事件属性
    * 3、在属性改变的Set方法中,调用该事件方法,参数有两个,第一个是发生的类,第二个是属性名
    */
    public class Student : INotifyPropertyChanged
    {
    #region INotifyPropertyChanged 成员
    // 通过这个事件,我们就能很好控制我们的属性了变更了。
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    private string name;
    public string Name
    {
    get {
    return this.name;
    }
    set {
    this.name = value;
    if (this.PropertyChanged != null) {
    // 只要属性发生改变。就会通知我们的目标。目标也同样更新
    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
    }
    }
    }
    }
    }
    好。我们来应用:
    界面设计很简单:
    <TextBox BorderBrush="Black" Margin="5" x:Name="txtStuName"/>
    <Button Content="改变属性" Width="100" Height="30" Click="Button_Click"/>
    只有一个空间一个按钮。
    在后台文件中我们来做数据的绑定:
    为了方便说明,我们定义一个全局的Student对象,变量名为stu.
    在窗体构造函数里面,我们来看看如果做数据绑定。
    /*
    * 使用Binding来实现数据绑定。
    * 1、声明数据源。这里就是我们的Student类了。
    * 2、声明Binding对象。
    * 3、把Binding对象的数据源和我们Student关联起来
    * 4、指定绑定的访问路径,也就是要绑定的属性了
    * 5、让绑定的数据同我们的UI关联起来。
    */
    stu = new Student();
    stu.Name = "我是";
    /*第一种绑定的方法(这个看起来代码有点多啊。还有简单的方法我们来看看这种方式)
    Binding bind = new Binding(); // 申明一个Binding对象
    bind.Source = stu; // 我们的数据源就是我们Student实例。这里是制定源
    bind.Path = new PropertyPath("Name"); // 这里是制定要绑定源中的那个属性
    BindingOperations.SetBinding(this.txtStuName,TextBox.TextProperty, bind); // 这里是让我们的源和Target关联起来
    */
    // 第二种绑定的方法 这个很简洁。我就不说明了。和上面其实是一样的。
    this.txtStuName.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu });
    上面就是数据绑定完毕了。
    下面我们来看看按钮里面我们做了什么
    private void Button_Click(object sender, RoutedEventArgs e)
    {
    stu.Name = stu.Name + "Tom";
    }
    其他什么也没有做。当我们运行起来,点击按钮,我们的文本框就变成"我是Tom";这里是不是很神奇。大家可以去试验下。

    下面的这个例子是为了验证数据绑定是双向的。
    试验是这样的。在窗体上有个文本框,滑块。滑动滑块,文本中数据会改变。我们改变文本框的数据,滑块也会改变。相信大家
    在脑海里面有一个印象了。我们直接看代码的实现:
    首先看XAML文件的布局。也很简单。一个TextBox,一个Slider。我的注释写的都很清楚哦。

    <!--
    把控件作为Binding的源来实现数据绑定
    1、在显示的属性中使用Binding形式如下:{Binding Path=Value,ElementName=控件名}
    2、这里的Path指代要数据源的属性
    3、这里的实现有几种形式:
    A、利用Binding的扩展方法。如:{Binding Path=Value, ElementName=silder}
    B、利用Binding的构造方法。其可以直接接受一个Path参数 如:{Binding Value, ElementName=silder}
    C、后台使用代码来实现 如: this.txtSilder.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName = "silder" });
    在这里,因为在cs中,我们可以直接访问控件。所以我们可以不使用ElementName来进行banding。可以这样来写:
    this.txtSilder.SetBinding(TextBox.TextProperty, new Binding("Value") { Source = this.silder });
    4、关于Binding还有几种属性:
    1、BindingMode.(TwoWay,OneWay,OnTime,OneWayToSource和Default)即更新模式
    2、UpdateSourceTrigger:(PropertyChnaged,LostFocus,Explicit,Default)
    -->
    <TextBox BorderBrush="Black" Margin="5" x:Name="txtSilder"></TextBox>
    <Slider BorderBrush="LightBlue" Minimum="0" Maximum="100" Margin="5" x:Name="silder"></Slider>

    看了注释我们应该知道有很多种Binding方法了。这几种方法我都试过。所以现在保留下来的文件时使用最后一个方法。
    后台大家也知道什么方法了啊。
    就是:
    // 采用控件作为另一个控件的数据源
    this.txtSilder.SetBinding(TextBox.TextProperty, new Binding("Value") { Source = this.silder,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
    其他什么代码就没有了。就是这么简单。大家去试验下。
  • 相关阅读:
    laravel md5+salt 密码
    sql语句 当前时间查找重复 时间戳转换
    Supesite 参数说明
    ajax
    PDO操作
    laravel paginate动态分页
    PHP iconv()函数转字符编码的问题(转)
    计算几何基础模板(2014.10.6一直沿用)
    hdu 4893
    2014 ACM/ICPC 鞍山赛区网络赛(清华命题)
  • 原文地址:https://www.cnblogs.com/heardawn/p/HeartDawn.html
Copyright © 2011-2022 走看看