先做个声明:这里绑定都在前台实现,至于后台怎么写,那比前台简单多了,但更常用的是xaml中绑定。我们分析下最简单的字符串绑定来弄清楚原理,其他的类推就是。

数据绑定主要是要弄清楚两个东西,一个是源Source,一个是路径Path。

什么能够作为源Source呢:

CLR类型的单个对象

CLR类型的集合对象

DataTable和DataView

XML数据

依赖对象

FrameworkElement的DataContext

控件及ElementName

假如现在有一个最简单的需求:有一个窗口MainWindow,它里面有一个文本框(TextBox),Name为textBox,文本框的内容(Text)要绑定一个字符串。

好了,现在我们要考虑一个上面需求没提到的问题,该字符串是哪的字符串?

1.另外一个类Student(含公开属性Name)的实例化对象对应的Name

在哪实例化这个类Student呢?

  • 在MainWindow.xaml.cs里,对不起,即使实例化了,xaml里无法直接访问cs里的实例化的对象。
  • 在xaml里实例化,有个不错的选择就是通过声明资源(Resource)
 <Grid>
<Grid.Resources>
<local:Student x:Key="stu" StuName="张三"/>
</Grid.Resources>
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding Source={StaticResource stu},Path=StuName}"/>
</Grid>

这种方法测试是可行的。

  • 那如果通过数据上下文DataContext的方式呢,怎么写

DataContext只要存在于要绑定的控件的本身或者其逻辑树父级以上就可以,我们还是定义在Grid上吧

 <Grid Name="grid">
<Grid.DataContext>
<local:Student StuName="李四"/>
</Grid.DataContext>
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding Path=StuName}"/>
</Grid>

这种方法测试也是可行的。

2.如果该字符串存在于当前页面,是当前页面的一个公开属性呢

 public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private string str; public string Str
{
get
{
return str;
} set
{
str = value;
}
}
}
  • 我们先尝试用资源实例化
 <Window.Resources>
<local:MainWindow x:Key="str" Str="王五" />
</Window.Resources>
<Grid Name="grid">
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding Source={StaticResource str}, Path=Str}" />
</Grid>

启动的时候报错了:

原因是资源不允许嵌套,就是说页面定义的资源不能是本身的实例。

  • 再试试DataContext
 <Grid Name="grid">
<Grid.DataContext>
<local:MainWindow Str="王五" />
</Grid.DataContext>
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding Path=Str}" />
</Grid>

跟上面报了相同的错,看来数据上下文也不能指定为自己的实例。

  • 那就没招了吗?有的,直接将整个窗口(它也是FrameworkElement)作为Source,通过指定ElementName的方式
 <Window x:Class="Binding.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:local="clr-namespace:Binding"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="525"
Height="350"
mc:Ignorable="d"
Name="this">
<Grid Name="grid">
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding ElementName=this, Path=Str}" />
</Grid>
</Window>

我们需要在cs里对Str赋值,否则绑定的是Str的默认值,这块我们这样理解,ElementName指定自己,那么就是实例化了一个MainWindow,它里面的属性都是取的默认值。

我们在构造里写 Str=“ZHAOLIU”,发现运行的文本框仍然为空,这是因为我们赋值是在界面初始化语句InitializeComponent();之后,

我们的属性又不具备更改通知功能,所以改变了值也不会起作用。下面我们就改造为可更改通知的。只需要继承接口INotifyPropertyChanged并实现他的约束就可以了。

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace Binding
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
Str = "ZHAOLIU";
}
private string str; public event PropertyChangedEventHandler PropertyChanged; public string Str
{
get
{
return str;
} set
{
str = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Str"));
}
}
}
}
}

经过测试是可以的。

3.如果字符串存在于另一个窗口,是其一个公开属性呢

我们再新建个窗口Window1

 public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private string str; public string Str
{
get
{
return str;
} set
{
str = value;
}
}
}

然后我们在MainWindow里实例化Window1试试

 <Window.Resources>
<local:Window1 x:Key="str" Str="王五" />
</Window.Resources>
<Grid Name="grid">
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding Source={StaticResource str}, Path=Str}" />
</Grid>

这是可以的。至此我们知道,资源中实例化一个对象,控件去绑定该对象的公开属性,只要一条,该对象不能是自己本身就ok。

使用DataContext也是可以的

 <Window.DataContext>
<local:Window1 Str="麻子"/>
</Window.DataContext>
<Grid Name="grid">
<TextBox Name="textBox"
Width="150"
Height="23"
BorderBrush="Black"
Text="{Binding Path=Str}" />
</Grid>

ElementName呢,MainWindow拿不到Window1里的控件,就算你给Window1给了个名字,在MainWindow也不能以字符串直接拿到,不知道你们有没有见过将控件的值绑定到另一个页面的一个控件上的。

总结下:

wpf XAML xaml 进行 数据绑定,Resource DataContext ElementName的更多相关文章

  1. WPF:XAML概述

    简介 XAML是eXtensible Application Markup Language可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言.XAML提供了一种便于 ...

  2. .Net Core WPF之XAML概述

    原文链接,机器翻译,有误处参看原文. XAML overview in WPF 2019/08/08 What is XAML XAML syntax in brief Case and white ...

  3. wpf中xaml的类型转换器与标记扩展

    原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...

  4. How can I list colors in WPF with XAML?

    How can I get list of all colors I can pick in Visual Studio Designer (which is System.Windows.Media ...

  5. 【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的

    原文:[C#]WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的 初学WPF,知道一些控件可以通过定义Style的Trigger改变要显示的样式,但是 ...

  6. 整理:WPF中Xaml中绑定枚举的写法

    原文:整理:WPF中Xaml中绑定枚举的写法 目的:在Combobox.ListBox中直接绑定枚举对象的方式,比如:直接绑定字体类型.所有颜色等枚举类型非常方便 一.首先用ObjectDataPro ...

  7. Wpf读写Xaml文件

    前言 本文主要介绍Wpf读写Xaml文件. 读写实现 首先我们使用XamlWriter将Wpf的对象转换为Xaml字符串,代码如下: var btn = sender as Button; strin ...

  8. WPF SDK研究 之 数据绑定

    这一章介绍数据绑定.本章共计27个示例,全都在VS2008下.NET3.5测试通过,点击这里下载:ConnectedData.rar 1.ShowDataWithoutBinding注: <?M ...

  9. WPF笔记(1.6 数据绑定)——Hello,WPF!

    原文:WPF笔记(1.6 数据绑定)--Hello,WPF! 这个一节都是在讲一个数据绑定的示例.功用:输入姓和名,点击Add按钮,ListBox增加一条记录,永远是字符串“name: nick”:L ...

随机推荐

  1. Oracle自动备份.bat 最新更新(支持Win10了)

    20170418更新: 很多年没有用了,最近两天打开来用,发现在Win10下面At命令已经被淘汰不能使用了,还有不少命令工作方式和原来也不一样了 所以就更新了一下下,使用 schtasks 命令代替了 ...

  2. 想询问一个职业规划的问题,前端开发 or nodejs?

    先说说个人情况,目前个人定位于初中级前端吧,工作近两年,目前前端开发和nodejs都有一定的了解,水平感觉可以搭一些小型的网站.作为前端开发,目前掌握的技术是javascript,平时更多的是用jqu ...

  3. 【Java SE】如何用Java实现冒泡排序

    摘要: 作为一名Java开发工程师,手头如果不会几个常见的排序算法,怎么可能经过笔试题这一关呢.据我所知,许多大型的公司的笔试题都有排序题,那我们先从最简单的排序:冒泡排序开始,以后几篇博客将继续更新 ...

  4. Javascript使用克隆的原型模式

    ECMAScript 5中提供了Object.create()方法. 使用这个方法很容易克隆一个一模一样的对象. var animal=function(){ this.blood=100; this ...

  5. Vue项目的部署

    通过vue-cli创建的工程,默认已经打好了基础,包含vue-loader webpack. 通常我们开发中,使用npm run dev进行开发,webpack会Hot reload,不用我们手动刷新 ...

  6. Xmind 体验分享

    Xmind 8 体验 初识思维脑图 这两天在学习使用思维脑图(xmind是其中一款软件)ing,在体验了一把思维脑图的使用后,深深感受到了脑洞大开的魔力. 从昨晚开始研究使用,到今天晚上截止,自己试着 ...

  7. 【Netty】Netty核心组件介绍

    一.前言 前篇博文体验了Netty的第一个示例,下面接着学习Netty的组件和其设计. 二.核心组件 2.1. Channel.EventLoop和ChannelFuture Netty中的核心组件包 ...

  8. iframe框架的应用

    同学接私活,我写几个页面. 后台系统,点击侧栏菜单后,右边div的要显示对应的内容.就是说,没选一下左边的菜单,右边的内容都要变化. 这次首先尝试了一下Oldfasional办法--iframe框架. ...

  9. 使用MyEclipse生成实体类和Hibernate映射文件

    1.打开MyEclipse DataBase Explorer. 如上图,点击图中2便可切换到MyEclipse DataBase Explorer,若没有该图标,则点击图中1,便可选择MyEclip ...

  10. App架构经验总结(转载)

    原文地址:http://www.iteye.com/news/31472 架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用 ...