一、绑定到非UI元素

上篇中,我们绑定的数据源均是派生自UIElement的WPF元素。本篇描述的绑定数据源是一个我们自定义的普通的类型。

注:尽管绑定的数据源可以是任意类型的对象,但Path必须总是指向一个公共属性。

当绑定一个非UI元素对象时,不能使用Binding.ElementName属性,但可以使用以下属性中的一个:

Source——该属性是指向源对象的引用,即提供数据的对象;

RelativeSource——该属性使用RelativeSource对象指定绑定源的相对位置,默认值为null;

DataContext属性——如果没有使用Source或RelativeSource属性指定一个数据源,WPF会从当前元素开始在元素树中向上查找,

检查每个元素的DataContext属性,并使用第一个非空的DataContext属性。当然你也可以自己设置DataContext属性。

下面我们模拟以下场景,左面的lable分别绑定我们自定义的类Person的Age和Name属性,右面我们可以动态的修改person中的Age和Name属性,当属性动态修改的时候,我们观察左面的lable中的文本信息是否发生变化。

参考代码如下:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data; namespace BindingDemo2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private Person person;
public Person Person
{
get { return person; }
set { person = value; }
}
public MainWindow()
{
InitializeComponent(); this.DataContext = this; person = new Person(); Binding binding = new Binding("Age") { Source = person };
lbAge.SetBinding(Label.ContentProperty, binding); } private void Button_Click(object sender, RoutedEventArgs e)
{
person.Age = Convert.ToInt32(tbAge.Text);
person.Name = tbName.Text;
}
}
public class Person
{
private int _age = 18; public int Age
{
get { return _age; }
set
{
_age = value;
}
} private string _name = "Mary";
public string Name
{
get { return _name; }
set
{
_name = value;
}
}
public Person()
{
Age = 18;
Name = "Mary";
} } }
<Window x:Class="BindingDemo2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BindingDemo2"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" Name="win">
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel>
<Label Content="Target"/>
<Label Content="Name"/>
<Label Content="{Binding Person.Name}" Height="30" Background="AliceBlue" Name="lbName"/>
<Label Content="Age"/>
<Label Height="30" Background="AliceBlue" Name="lbAge"/>
</StackPanel>
<StackPanel Grid.Column="1">
<Label Content="Source"/>
<Label Content="Name"/>
<TextBox Height="30" Background="AliceBlue" Name="tbName" Text="Mary"/>
<Label Content="Age"/>
<TextBox Height="30" Background="AliceBlue" Name="tbAge" Text="18"/>
<Button Content="Set" Click="Button_Click"></Button>
</StackPanel>
</Grid>
</Window>

运行结果如下:

从结果可以发现,我们的绑定成功了。但是,当我们在右面修改Name和Age的时候,左面的lable中的文字信息却没有发生改变,这是为什么呢?

通过调试我们发现,点击Set按钮之后,person对象中的属性的确是改变了,但是由于属性改变没有通知binding,所以界面的UI没有更新。

为了可以通知binding属性修改了,我们对数据源Person类做如下修改:

   public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged; if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
private int _age = 18; public int Age
{
get { return _age; }
set
{
_age = value;
OnPropertyChanged("Age");
}
} private string _name = "Mary"; public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
public Person()
{
Age = 18;
Name = "Mary";
} }

如此一来,当person更新的时候,UI就会随着一起更新了。

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

  1. WPF数据绑定Binding(二)

    WPF数据绑定Binding(二) 1.UI控件直接的数据绑定 UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上. ...

  2. WPF——数据绑定(一)什么是数据绑定

    注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简 ...

  3. WPF 数据绑定Binding

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

  4. 剖析WPF数据绑定机制

    引言 WPF框架采取的是MVVM模式,也就是数据驱动UI,UI控件(Controls)被严格地限制在表示层内,不会参与业务逻辑的处理,只是通过数据绑定(Data Binding)简单忠实地表达与之绑定 ...

  5. WPF 10天修炼 第十天- WPF数据绑定

    WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件 ...

  6. Kendo MVVM 数据绑定(二) Checked

    Kendo MVVM 数据绑定(二) Checked Checked 绑定用在 checkbox ()或 radio button ()上.注意: checked 绑定只适用于支持 checked 的 ...

  7. WPF属性(二)附加属性

    原文:WPF属性(二)附加属性 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解 ...

  8. 微软原文翻译:适用于.Net Core的WPF数据绑定概述

    原文链接,大部分是机器翻译,仅做了小部分修改.英.中文对照,看不懂的看英文. Data binding overview in WPF 2019/09/19 Data binding in Windo ...

  9. C#-WPF数据绑定基础(一)

    前言:WPF数据绑定技术有效的提高了程序的容错率,可以最大程度的保持程序的健壮性,从而降低程序在使用过程中崩掉的可能性. 接下来,我将分享一下我在写测量程序过程中所用到的数据绑定方面的知识 首先,我所 ...

  10. C#WPF数据绑定模板化操作四步走

    前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...

随机推荐

  1. 在不受支持的 Mac 上安装 macOS Monterey 12

    请注意,当前为 Beta 版,后续会及时更新. 请访问原文链接:https://sysin.org/blog/install-macos-12-on-unsupported-mac/,查看最新版.原创 ...

  2. 什么是 BPMN ?为什么我们要用 BPMN 和工作流 ?

    BPMN 和 Activiti 介绍 工作流介绍 在任何行业和企业中,都有各种各样的流程,例如: 请假流程 报销流程 入职流程 离职流程 出差流程 等等-- 就算你自己没有设计过工作流,那么你每天肯定 ...

  3. c# 将checkedListBox选择的值保存再数组中并转换成以指定字符连接的字符串

    经常忘记,所以记一下: string[] arr =new string[3]; int b = 0; foreach (string outstr in checkedListBox1.Checke ...

  4. Power Apps 画布应用中非可委派函数查询数量限制

    本文介绍: Power Apps 中的委派函数和非可委派函数. 现象: 在Power Apps中显示某些数据源时,如果数据量超过 500,则可能遇到现实不全的情况,实际上大部分是由于 委派函数 和 非 ...

  5. python进程间的通讯实现

    1:进程间通讯的方法:apply_async()非阻塞式通讯     apply()阻塞式通讯 2:使用Queue实现对Process创建的进程间通讯, Queue本身是一个消息队列程序,Queue常 ...

  6. 🔥 LeetCode 热题 HOT 100(21-30)

    46. 全排列 思路:典型回溯法 class Solution { public List<List<Integer>> permute(int[] nums) { Linke ...

  7. 用Python预测双色球福利彩票中奖号码(请不要当真)

    前言 双色球是中国福利彩票的一种玩法. 红球一共6组,每组从1-33中抽取一个,六个互相不重复.然后蓝球是从1-16中抽取一个数字,这整个组成的双色球 python从零基础入门到实战 今天,我们就用P ...

  8. 第1篇-关于JVM运行时,开篇说的简单些

    开讲Java运行时,这一篇讲一些简单的内容.我们写的主类中的main()方法是如何被Java虚拟机调用到的?在Java类中的一些方法会被由C/C++编写的HotSpot虚拟机的C/C++函数调用,不过 ...

  9. 阿里钉钉Android实习面试也太太太太难了吧,对算法的要求堪比字节

    本人研究生在读,在2月26日找了师兄内推阿里钉钉团队,28号接到了约1面的电话.幸好我提前准备了一个多月的样子,刷面试题.刷LeetCode(面了之后才觉得自己刷少了),对于我这样一个实习生来说题目还 ...

  10. 做了两年多的安卓,突然想转Java后端,感觉Android职业前景不太好,转还是不转?

    近几年相信很多Android开发者都有过这种想法,最终还是有些Android 开发选择了转行,但是还有些开发者选择了坚持. 因为现在Android开发确实竞争很大,很多公司抛出几个岗位,每天能收到成百 ...