先做个声明:这里绑定都在前台实现,至于后台怎么写,那比前台简单多了,但更常用的是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. C++ 窗口可改风格

    SetWindowLong(m_hWnd,GWL_STYLE,::GetWindowLong(m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);//去掉最大化 GWL_S ...

  2. PROFINET有什么用

    “工业4.0”是当前制造业最热门的话题,所以不谈这个话题都不好意思跟同行们打招呼.“工业4.0”里面的一个重要内容是智慧工厂,工厂流水线设备之间通信,无论是传统的有线连接还是先进的无线连接与分布式控制 ...

  3. SELECT中(非常)常用的子查询操作

    MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...

  4. 苹果笔记本只能上QQ,微信,任何浏览器不能打开网页的问题。

    我的笔记本一共遇到过两次这种情况.第一次是浏览器输入域名打不开网页,而输入ip地址可以打开.这就是DNS服务器的问题,解决方法很简单.在系统偏好设置里面找到网络,然后,点击正在连接的网络的高级选项,选 ...

  5. RHive

    R + Hive = RHive 支持原创:http://blog.fens.me/nosql-r-hive/ R利剑NoSQL系列文章 之 Hive Hive介绍 Hive安装 RHive安装 RH ...

  6. 日期时间插件flatpickr.js使用方法

    今天写代码时需要用一款插件来实现对input输入时间的格式控制,找到了两款功能合适而且比较美观的插件:基于Bootstrap的DateTimePicker.js和flatpickr.js插件.一开始先 ...

  7. 第一篇 Rewrite规则简介

    1.Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必 ...

  8. codeforces 782B The Meeting Place Cannot Be Changed (三分)

    The Meeting Place Cannot Be Changed Problem Description The main road in Bytecity is a straight line ...

  9. http工具类

    /** * 发送post请求工具方法 * * @Methods Name HttpPost * @Create In 2014年10月28日 By wangfei * @param url * @pa ...

  10. 2017最新最稳定的合买彩票源码asp+sql2008 新增PK式彩种+全新界面

    下载地址: http://115.238.250.104:81/cnzz_code/2016-05/04/klcphm_v2016.rar 网站后台管理系统:新闻资讯系统 用户管理系统用户登录日志彩种 ...