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 });
    其他什么代码就没有了。就是这么简单。大家去试验下。
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/heardawn/p/HeartDawn.html
Copyright © 2011-2022 走看看