WPF数据绑定Binding(二)

1.UI控件直接的数据绑定

UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上。源属性可以是任意类型,但目标属性必须是依赖属性(Dependency Property)。通常情况下我们对于UI对象间的绑定源属性和目标属性都是依赖属性 (有些属性不是) ,因为依赖属性有垂直的内嵌变更通知机制,WPF可以保持目标属性和源属性的同步。

布局文件绑定源码:

<StackPanel Orientation="Vertical">
        <Slider Name="slider1" Margin="10 10 10 0" Minimum="9" Maximum="50"
                Value="12" TickFrequency="5"></Slider>
        <TextBlock Name="txtB_info" Text="上海世博会" Margin="10 10 10 0"
                   FontSize="{Binding ElementName=slider1, Path=Value}"></TextBlock>
        <TextBox Name="txt_fontSize" Text="{Binding ElementName=slider1, Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"           Margin="10 10 10 0"></TextBox>
        <TextBox Margin="10 10 10 0"></TextBox>
    </StackPanel>

1.1 C#后台源码进行数据绑定源码:

1. 调用FrameworkElement 或FrameworkContentElement对象的SetBinding方法

2. 调用BindingOperations.SetBinding静态方法

  //绑定对象
            Binding binding = new Binding();
            //设置绑定数据源对象
            binding.ElementName = "slider1";
            //设置数据流的方向
            binding.Mode = BindingMode.TwoWay;
            //设置源属性
            binding.Path = new PropertyPath("Value");
            //进行数据绑定
            txtB_info.SetBinding(TextBlock.FontSizeProperty, binding);
            //第二中绑定方式
            BindingOperations.SetBinding(txt_fontSize, TextBox.TextProperty, binding);

1.2 C#后台清除绑定的数据

当你在应用程序中某个地方添加了绑定,而在某个时候又不想这个绑定在接下来继续有效时,你可以有两种方式来断开这个绑定:

1. 用BindingOperations.ClearBinding静态方法。

例如BindingOperations.ClearBinding(currentTextBlock, TextBlock.TextProperty); BindingOperations同时还提供了ClearAllBindings方法,只需要传入要清除绑定的目标对象的名称,它就会将所有这个对象的绑定移除。

2.简单的将目标属性设置为一个新的值。

这个简单的方法同样有效,可以断开与前边设置的binding的连接。简单的设置为任何值即可:如:currentTextBlock.Text = “it’s a new value.”;

            //清除txtB_info的数据绑定 绑定数据流向 如果为Mode=TwoWay 侧不能清除绑定
            //只要Mode的值不是TwoWay
            txtB_info.FontSize = ;
          //最好使用下面的方式清除数据绑定
            BindingOperations.ClearBinding(txt_fontSize, TextBox.TextProperty);

           //清除所有绑定
            BindingOperations.ClearAllBindings(txt_fontSize);

效果图:

1.3 Binding对象的属性说明

序号           属性名                          描述

1         Converter            转换器,将绑定的内容转换成自己需要的内容。自定义转换类 必须继承于:IValueConverter接口

2         ElementName          绑定的源对象,本人理解 专程用于UI控件之间属性的绑定

3         FallbackValue        绑定无法返回有效值时的默认显示值

4         Mode                 绑定方式,枚举类型 Default OneWay TwoWay OneTime OneWayToSource

5         Path                 属性 路径,用来指定要绑定数据源的路径,其性质是一个属性,该属性该当是依靠属性,

也即便能够告终积极更新机制的【单个类实现INotifyPropertyChanged、集合要 实现INotifyCollectionChanged接口】

6        RelativeSource        常用于自身绑定或者数据模板中来指定绑定的源对象及控件模块中的绑定。

7        Source                源对象,控件或自定义对象等。

8        StringFormat          格式化表达式

9        UpdateSourceTrigger             在双向绑定时TwoWay 或 OneWayToSource 时。用来确定属性更改的时机。

UpdateSourceTrigger枚举类型:Default,PropertyChanged,LostFocus,Explicit。

10                    ValidationRules                     验证规则.可以被设置为一个或多个派生自ValidationRule的对象,

每个规则都会检查特定的条件并更具结果来标记数据的有效性

1.4 Mode  五种绑定方式 Default OneWay TwoWay OneTime OneWayToSource

1. Default     默认的,一般来说,对于用户可以设置的(如TextBox.Text属性)是双向的,而其他则是单向的。

2. OneWay      单向绑定 当源属性变化时更新目标属性。

3. TwoWay      双向绑定 数据源和目标都会随之改变,但是更加消耗系统资源。

4. OneTime     只绑定一次,以后数据源的改变都不会改变目标属性值。(如果用C#代码后台调用:

BindingExpression bindingExpression = BindingOperations.GetBindingExpression(txtB_info, TextBlock.FontSizeProperty);//方式二

//BindingExpression bindingExpression=txtB_info.GetBindingExpression(TextBlock.FontSizeProperty);//方式二

bindingExpression.UpdateSource();)

5. OneWayToSource  反向绑定,目标属性的改变 及时更新数据源。

1.5 UpdateSourceTrigger    四种用来确定属性更改的时机,对于 Model=TwoWay 及 OneWayToSource是源数据改变时机。

1.Default          由不同控件控制. 例如 TextBox, 当 LostFocus 事件触发时,目标绑定发生变化.

2.PropertyChanged    意味着当目标控件值发生变化时,源数据立马更新.例如, TextBox是目标绑定,当输入字符时, 源数据也发生变化.

这就意味着当你输入字符的时候,TextBox的数据Text也在改变 源数据也在改变。 这是比较消耗系统资源,更新的频率比较快。

3.LostFocus      当目标控件失去焦点后,源数据发生变化。

4.Explicit            当UpdateSourceTrigger 设置为 Explicit, 数据源不会自动更新,只有在后代码里面显示的触发。

BindingExpression bindingExpression = BindingOperations.GetBindingExpression(txtB_info, TextBlock.FontSizeProperty);//方式一

//BindingExpression bindingExpression=txtB_info.GetBindingExpression(TextBlock.FontSizeProperty);//方式二

bindingExpression.UpdateSource();

2.UI属性绑定数据对象。

2.1 UI属性直接绑定实例对象    2.2 UI属性直接绑定静态对象      2.3 UI属性绑定资源中的对象。

前台布局代码

<Window x:Class="WPFBindingDemo.RelativeSourceWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFBindingDemo"
        Title="RelativeSourceWindow" Height="300" Width="500">
    <Window.Resources>
        <local:Student x:Key="stuKey" StudentID="20110702" Name="王六" EntryDate="2011-09-01" Credit="80.5"/>
    </Window.Resources>
    <StackPanel Orientation="Vertical">
        <GroupBox Header="绑定实例对象">
            <StackPanel Orientation="Horizontal" Name="stackPanel1">
                <TextBlock Text="学号:"/>
                <TextBlock Text="{Binding Path=StudentID}"/>
                <TextBlock Text="姓名:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=Name}"/>
                <TextBlock Text="入学日期:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=EntryDate, StringFormat=yyyy-MM-dd}"/>
                <TextBlock Text="学分:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=Credit}"/>
            </StackPanel>
        </GroupBox>
        <GroupBox Header="绑定静态对象">
            <StackPanel Orientation="Horizontal" DataContext="{x:Static local:GlobalData.student}">
                <TextBlock Text="学号:"/>
                <TextBlock Text="{Binding Path=StudentID}"/>
                <TextBlock Text="姓名:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=Name}"/>
                <TextBlock Text="入学日期:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=EntryDate, StringFormat=yyyy-MM-dd}"/>
                <TextBlock Text="学分:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=Credit}"/>
            </StackPanel>
        </GroupBox>
        <GroupBox Header="绑定资源中的对象">
            <StackPanel Orientation="Horizontal" DataContext="{StaticResource ResourceKey=stuKey}">
                <TextBlock Text="学号:"/>
                <TextBlock Text="{Binding Path=StudentID}"/>
                <TextBlock Text="姓名:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=Name}"/>
                <TextBlock Text="入学日期:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=EntryDate, StringFormat=yyyy-MM-dd}"/>
                <TextBlock Text="学分:" Margin="20 0 0 0"/>
                <TextBlock Text="{Binding Path=Credit}"/>
            </StackPanel>
        </GroupBox>
        <GroupBox Header="修改绑定对象的值">
            <StackPanel Orientation="Horizontal" ButtonBase.Click="StackPanel_Click">
                <Button Name="btn_new" Content="修改实体对象值" Margin="10 0 0 0"></Button>
                <Button Name="btn_static" Content="修改静态对象值" Margin="20 0 0 0"></Button>
                <Button Name="btn_resource" Content="修改资源中对象的值" Margin="20 0 0 0"></Button>
            </StackPanel>
        </GroupBox>
    </StackPanel>
</Window>

辅助 Student类

 public class Student
    {
        public Student()
        {

        }
        private int studentID;
        /// <summary>
        /// 学号
        /// </summary>
        public int StudentID
        {
            get { return studentID; }
            set { studentID = value; }
        }
        private string name;
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private DateTime entryDate;
        /// <summary>
        /// 入学日期
        /// </summary>
        public DateTime EntryDate
        {
            get { return entryDate; }
            set { entryDate = value; }
        }
        private double credit;
        /// <summary>
        /// 学分
        /// </summary>
        public double Credit
        {
            get { return credit; }
            set { credit = value; }
        }
    }

Xaml 后台代码:

 public RelativeSourceWindow()
        {
            //对静态对象进行赋值
            Student stu = , Name = "李四", EntryDate = DateTime.Parse("2012-09-15"), Credit = 40.5 };
            GlobalData.student = stu;
            InitializeComponent();
            //实例对象数据源
            stackPanel1.DataContext = , Name="张三", EntryDate=DateTime.Parse("2013-09-01"), Credit=0.0};
        }
        private void StackPanel_Click(object sender, RoutedEventArgs e)
        {
            Button btn = e.OriginalSource as Button;
            if (btn != null)
            {
                switch (btn.Name)
                {
                    case "btn_new":
                        {
                            Student stu = (Student)stackPanel1.DataContext;
                            stu.Name = "张三三";
                            stu.Credit = 34.5;

                        }
                        break;
                    case "btn_static":
                        {
                            GlobalData.student.Name = "李四四";
                            GlobalData.student.EntryDate = DateTime.Now;
                        }
                        break;
                    case "btn_resource":
                        {
                            Student stu = (Student)this.FindResource("stuKey");
                            stu.Name = "王六六";
                            stu.StudentID = ;
                        }
                        break;
                    default:
                        break;
                }
            }
        }

全局静态变量:

  public class GlobalData
    {
        public static Student student = null;
    }

效果截图:
2.4 实现

积极更新机制的【单个类实现INotifyPropertyChanged、集合要 实现INotifyCollectionChanged接口】 Student 要实现 INotifyPropertyChanged 接口。

修改后 Student 类

public class Student:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
                handler(this, e);
            }
        }

        public Student()
        {

        }
        private int studentID;
        /// <summary>
        /// 学号
        /// </summary>
        public int StudentID
        {
            get { return studentID; }
            set
            {
                if (studentID == value)
                    return;
                studentID = value;
                OnPropertyChanged("StudentID");
            }
        }
        private string name;
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name
        {
            get { return name; }
            set
            {
                if (name == value)
                {
                    return;
                }
                name = value;
                OnPropertyChanged("Name");
            }
        }
        private DateTime entryDate;
        /// <summary>
        /// 入学日期
        /// </summary>
        public DateTime EntryDate
        {
            get { return entryDate; }
            set
            {
                if (entryDate == value)
                    return;
                entryDate = value;
                OnPropertyChanged("EntryDate");
            }
        }
        private double credit;
        /// <summary>
        /// 学分
        /// </summary>
        public double Credit
        {
            get { return credit; }
            set
            {
                if (credit == value)
                    return;
                credit = value;
                OnPropertyChanged("Credit");
            }
        }

    }

本文写到这里,希望阅读后对你有帮助。本人菜鸟一个,望提出宝贵意见。

WPF数据绑定Binding(二)的更多相关文章

  1. WPF 数据绑定Binding

    什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...

  2. WPF——数据绑定(二)绑定方法—绑定本地对象

    注意:本人初学WPF,文中表达或技术性问题请勿见怪,欢迎指正,谢谢 标记拓展语法:绑定到本地对象 什么是绑定到本地对象,我个人理解就是实现UI层上两个或多个控件的相互关联,一个控件的状态改变,导致另一 ...

  3. 数据绑定(二)把控件作为Binding源

    原文:数据绑定(二)把控件作为Binding源 下面的代码把一个TextBox的Text属性关联在了Slider的Value属性上 <Window x:Class="WpfApplic ...

  4. WPF之Binding深入探讨

    原文:http://blog.csdn.net/fwj380891124/article/details/8107646 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在 ...

  5. WPF的Binding功能解析

    1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...

  6. WPF之Binding深入探讨--Darren

    1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...

  7. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

  8. WPF之Binding【转】

    WPF之Binding[转] 看到WPF如此之炫,也想用用,可是一点也不会呀. 从需求谈起吧: 首先可能要做一个很炫的界面.见MaterialDesignInXAMLToolKit. 那,最主要的呢, ...

  9. WPF之Binding深入探讨 转载:http://blog.csdn.net/fwj380891124/article/details/8107646

    1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...

随机推荐

  1. iOS UISlider的使用

    UISlider是一个方便的控件,让用户能够以可视化的方式设置指定范围内的值. 和按钮一样,滑块也能响应事件,还可像文本框一样被读取.如果希望用户对滑块的调整立刻影响应用程序,则需要让他触发操作. 下 ...

  2. 浅谈自我对git的初步认识

    本学期我们新增了一门课程,那就是软件工程,不知道为什么,感觉有种莫名的高大上.哈哈!难道是这个名称太抽象了吗?这个问题我感觉到后来肯定就明白了. 第一次博客,感觉好紧张哦,嘿嘿!老师让我们谈谈对git ...

  3. codeforces 652D . Nested Segments 线段树

    题目链接 我们将线段按照右端点从小到大排序, 如果相同, 那么按照左端点从大到小排序. 然后对每一个l, 查询之前有多少个l比他大, 答案就是多少.因为之前的r都是比自己的r小的, 如果l还比自己大的 ...

  4. ASP.Net页面传值比较

    ASP.Net页面传值比较   作为一个ASP.Net程序员,尤其是搞B/S开发的,对于不同页面之间变量值的传递用的非常广泛,而掌握不同方式之间的区别和特点也就很有必要.本文将针对这一知识点做一个简单 ...

  5. 1016: [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6200  Solved: 2518[Submit][St ...

  6. IIS部署项目

    控制面板\所有控制面板项\管理工具-->Internet 信息服务(IIS)管理器 随便填个名称,项目的路径,选择一个新的端口.

  7. jedis集群版应用

    1.pom文件添加依赖: 2.创建配置文件 <!-- jedis集群版配置(JedisCluster通过构造传参(2个参数)) --> <bean id="redisCli ...

  8. LeetCode(39):组合总和

    Medium! 题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  9. 【托业】【新托业TOEIC新题型真题】学习笔记13-题库四-P7

    >counterpart 对应的人 >Master of Business Administration 工商管理学硕士 >superb 极好的 >executive 执行总监 ...

  10. Linux基本命令学习与使用

    1.chgrp,chown,chmod(-R递归修改文件夹下的文件) chgrp:修改文件属于哪个组 chown:修改文件属于哪个用户 chmod:修改文件权限r=4,w=2,x=1 chmod 4+ ...