当前位置: 首页 > 编程日记 > 正文

MVVM 数据绑定

一、在 XAML 中创建绑定

  1. 定义源对象。

    C#
    public class Dog
    {public string DogName { get; set; }
    }
     
  2. 在 XAML 中创建对源对象的命名空间的引用。

    XAML
    <UserControl x:Class="BindingXAML.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:my="clr-namespace:BindingXAML">
  3. Resources 节创建源对象的实例。

    XAML
    <Grid.Resources><my:Dog x:Name="MyDog" DogName="Spot"/>
    </Grid.Resources>
  4. 通过设置 Source 属性或 DataContext 属性绑定到源对象。该元素的所有子级都继承 DataContext。

    XAML
    <TextBlock Text="{Binding DogName, Source={StaticResource MyDog}, Mode=OneTime}"/>
    

    - 或 -

    XAML
    <TextBlock Text="{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>

此例中数据源是一个XAML对象,该对象是代码中创建的MyDog类的一个实例。Binding是在XAML中的TextBlock中指定的Binding,如示例中的代码那样指定的话,也就相当于创建了以个Binding对象 并制定其路径(DogName)和模式等。

二、使用代码创建绑定

  1. 添加 System.Windows.Data 命名空间。

    C#
    using System.Windows.Data; (Binding类的命名空间)
  2. 定义源对象。

    C#
    public class Dog
    {public string DogName { get; set; }
    }
  3. 创建要绑定到的 FrameworkElement。

    XAML
    <Grid x:Name="LayoutRoot" Background="White"><TextBlock x:Name="MyTextBlock" Text="Test"/>
    </Grid>
  4. 创建源对象的实例。

    C#
    Dog MyDog = new Dog();
    MyDog.DogName = "Spot";
  5. 创建绑定对象。

    C#
    Binding MyBinding = new Binding();
  6. 对绑定对象设置绑定属性。

    C#
    MyBinding.Path = new PropertyPath("DogName");
    MyBinding.Mode = BindingMode.OneTime;
  7. 通过设置 Source 属性或 DataContext 属性来设置绑定源。该元素的所有子级都继承 DataContext。

    C#
    MyBinding.Source = MyDog;
     

    - 或 -

    C#
    MyTextBlock.DataContext = MyDog;
  8. 将此绑定附加到 FrameworkElement 的属性。

    C#
    MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);

以上示例中是通过代码创建绑定的示例。这个示例中在TextBlock的Text属性中就没有创建Binding对象了,而是通过后台创建好Binding对象,并设置好属性,然后通过MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);将TEXT属性进行绑定。

在两个示例中都可以看到,指定数据源有两种方法,以TextBlock为例,可以指定Binding类的Source属性到数据源,也可以将TextBlock的DataContext指定到数据源,效果一样,如果TextBlock没有指定数据源,会在其绑定的Binding中寻找是否有数据源。

在实际开发中,为了让程序更可看更有条理,我们会混合使用两种方法,及在后台创建数据源,在XAML中绑定。这样前台就免去了创建数据源的XAML元素,后台省去了创建Binding类的代码,并且通过查看前台的XAML代码就可以很容易的判断出各个控件的绑定数据。

代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Data;

namespace SilverlightTest

{

public partial class Databind : UserControl

{

public Databind()

{

InitializeComponent();

}

private void UserControl_Loaded(object sender, RoutedEventArgs e)

{

Mind m = new Mind();

txt1.DataContext = m;

}

}

public class Mind  //数据源

{

string _info="OK";

public string Info

{

get

{

return _info;

}

set

{

_info = value;

}

}

}

}

XAML:

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SilverlightTest.Databind"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="400" Height="300" Loaded="UserControl_Loaded">

<Grid x:Name="LayoutRoot" Background="White">

<TextBlock  x:Name="txt1" Text="{Binding Info,Mode=OneTime}" />

</Grid>

</UserControl>

这样的写法让数据绑定可读性更高,也更容易理解,最常用的方式。

下面来比对下XAML创建和代码创建:

{Binding Info,Mode=OneTime}

相当于

Binding MyBinding = new Binding();

MyBinding.Path = new PropertyPath("Info"); MyBinding.Mode = BindingMode.OneTime;

Text="{Binding Info,Mode=OneTime}"

相当于

MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);

<TextBlock Text="{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>中的 DataContext="{StaticResource MyDog}

相当于

txt1.DataContext = m;

以上就是在Silverlight中数据绑定的一些简要介绍。

混合XAML 和代码的创建数据绑定的方式是最容易理解和阅读的,所以我们经常会看到在使用DataGrid的通过制定ItemsSource 到数据源后,在XAML中就直接使用"{Binding Address}"进行数据绑定了,DataGrid中的ItemSource也就相当于TextBlock的DataContext属性了,其他控件的数据绑定方法了类似,另外数据源可以用类,也可以是字符串类型等常量类型,使用常量类型时,就不需要指定Binding的Path属性了,因为他本身就是数据。

原文:http://blog.csdn.net/banmuhuangci/article/details/4160092

转载于:https://www.cnblogs.com/Yu-weiz/archive/2013/01/06/2847181.html

相关文章:

linux配置文件怎么把某行后几个字符替换_vim(Linux运维)

一、vim使用介绍 介绍在linux系统中&#xff0c;大部分配置文件都是ASCII的纯文本形式存放的&#xff0c;所以我们在修改系统设置的时候使用简单的文本编辑软件就可以实现了&#xff0c;如果你使用过windows当中的word的话&#xff0c;那么你可能会感觉linux字符界面的文本编辑…

Debian 6.0 安装过程 及中文乱码

2019独角兽企业重金招聘Python工程师标准>>> Debian 6.0 安装过程 Debian 6.0 安装过程 转(一个别人自录的安装过程录相) http://v.youku.com/v_show/id_XMjUyMzY1OTIw.html 转(别人写的一个过程) http://hi.baidu.com/ljx_freebsd/blog/item/88d60c09da379da22edd…

git 提交丢失Warning, you are leaving 2 commits behind,

早上在自己的一个版本代码上编辑&#xff0c;提交commint&#xff0c;但是checkout到其他分支再checkout回来发现该的东西不见了&#xff0c; 幸好terminal还没有关掉&#xff0c;回看日志&#xff1a; Warning: you are leaving 2 commits behind, not connected toany of you…

一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?

VLAN&#xff08;虚拟局域网&#xff09;是对连接到的第二层交换机端口的网络用户的逻辑分段&#xff0c;不受网络用户的物理位置限制而根据用户需求进行网络分段。一个VLAN可以在一个交换机或者跨交换机实现。VLAN可以根据网络用户的位置、作用、部门或者根据网络用户所使用的…

需要反射时使用dynamic

//使用dynamic的写法 dynamic fileExplorerData _currentFolder.FileExplorerData; var data fileExplorerData.InsertFromPath(newPath);//使用反射的写法 MethodInfo InsertMethod _currentFolder.FileExplorerData.GetType().GetMethod("InsertFromPath"); var…

Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy

Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy 原文连接: https://blog.csdn.net/wsj18808050/article/details/79824619 内容&#xff1a; QtCreator在前几天发布了4.6.0的版本&#xff0c;增加了两个非常棒的新功能&#xff0c;分别是Clang-Tidy和Clazy 官方…

JAVA swing初级教程(四)

附加的swing小部件(下) JOptionPane JOptionPane 是在 Swing 中类似“快捷方式”的东西。通常&#xff0c;作为 UI 开发人员&#xff0c;您需要向用户呈现快速信息&#xff0c;让用户了解错误和信息。甚至可能想得到一些快速数据&#xff0c;例如名称或数字。在 Swing 中&#…

Akka源码分析-Remote-发消息

上一篇博客我们介绍了remote模式下Actor的创建&#xff0c;其实与local的创建并没有太大区别&#xff0c;一般情况下还是使用LocalActorRef创建了Actor。那么发消息是否意味着也是相同的呢&#xff1f; 既然actorOf还是委托给了LocalActorRef&#xff0c;那么在本地创建的Actor…

用sed 给文本文件加行号

看例子&#xff1a; [rootlocalhost tmp]# sed test.txt 1 tsttst tsttsttst 2 west gao 3 west abces [rootlocalhost tmp]# sed test.txt | sed N;s/\n/\t/ 1 tsttst tsttsttst 2 west gao 3 west abces [rootlocalhost tmp]# N的解释&#xff1a; N&am…

Qt 编译一直死循环问题

Qt 编译一直死循环问题 有时候Qt编译项目时&#xff0c; 一直编不过&#xff0c;查看一下编译窗口&#xff0c;发现一直在循环 输出如下: C:\soft\Qt5.11\5.11.1\mingw53_32\bin\qmake.exe -o Makefile ..\..\..\..\PalmQtLib\PalmQtLib\PalmQtLib.pro -spec win32-g "…

路由器运行python脚本_写个Python脚本来登录小米路由器

这个脚本写起来难度并不是很大&#xff0c;博主还是一步步的分析下&#xff0c;这样思路会比较清晰&#xff0c;下次遇到类似系统脚本写起来也更快速。好了&#xff0c;一起来分析分析。首先看下小米路由器的登录界面可以看到只需要输入密码即可登录&#xff0c;博主这里为了演…

PHP定时执行任务的实现

2019独角兽企业重金招聘Python工程师标准>>> ignore_user_abort();//关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $interval60*30;// 每隔半小时运行 do{//这里是你要执行的代码 sleep($i…

Spring事务管理 与 SpringAOP

1&#xff0c;Spring事务的核心接口 Spring事务管理的实现有许多细节&#xff0c;如果对整个接口框架有个大体了解会非常有利于我们理解事务&#xff0c;下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略。   Spring事务管理涉及的接口的联系如下&#xff1a; 1.…

iso镜像文件烧写到U盘

iso镜像文件烧写到U盘 windows rufus-3.1.exe 百度云盘链接&#xff1a;https://pan.baidu.com/s/16p1O4lXMVTUltTvCm0DnHA 提取码&#xff1a;inzj 文件格式一般选择默认的就行,如果起不来,就换一个, linux 1、dd命令 2、系统自带 usb-creator-gtk工具 命令行输入&#x…

webgl 游戏_30个令人惊叹的WebGL示例和演示

WebGl仍在增长&#xff0c;尽管大多数现代浏览器都支持它&#xff0c;但它也可能需要在旧的浏览器上工作。在本文中&#xff0c;我遇到了很多WebGL的示例和演示&#xff0c;它们可以增进您对这项新技术的理解。因此&#xff0c;请坐下来放松身心&#xff0c;使用最新的浏览器&a…

IE8下的VML显示问题解决方案

最近在维护一个使用VML画曲线的网站&#xff0c;在不同的IE下浏览效果不一样&#xff0c;特别是在IE8下&#xff0c;出现莫名其妙的样式显示问题&#xff1a; 1.曲线不可见&#xff01;在IE9或IE7下&#xff0c;曲线正常绘制&#xff0c;但是在IE8下&#xff0c;不见坐标轴和曲…

创新工场有哪些失败项目?不要只看着成功

创新工场有哪些失败项目&#xff1f;不要只看着成功 李开复 &#xff0c;创新工场CEO回答&#xff1a;失败或碰到挑战的项目也不少。这里不点名&#xff0c;不谈细节&#xff0c;但是谈谈碰到什么挑战&#xff08;有些已经失败&#xff0c;有些还在努力&#xff09;&#xff1a…

彻底解决Linux索引节点(inode)占用率高的告警

今天邮箱里发现有一封某服务器inode使用率发生告警的邮件 登录到服务器上df -i查看&#xff0c;发现/路径下91%&#xff0c;磁盘使用率却不高&#xff0c;猜测可能是某个目录下的小文件过多&#xff0c;进而造成inode占用率过高&#xff0c;但不清楚根路径下各文件夹里的文件数…

镜像打包工具clonezilla

镜像打包工具clonezilla clonezilla 百度云盘链接&#xff1a;https://pan.baidu.com/s/1LOEPqNE9O0Z4QJmNExlgeA 提取码&#xff1a;zlso 使用方法&#xff1a; 1、将镜像直接烧入U盘 2、U盘启动

python数据分析设置_Python 数据分析系列之如何安装和设置 Python

由于人们用 Python 所做的事情不同&#xff0c;所以没有一个普适的 Python 及其插件包的安装方案&#xff0c;接下来我将详细介绍各个操作系统上 Python 科学计算环境部署。我推荐免费的 Anaconda 安装包&#xff0c;Anaconda 提供 Python 2.7 和 3.6 两个版本&#xff0c;以后…

javamail gmail

http://www.programfan.com/club/showpost.asp?id27614转载于:https://www.cnblogs.com/yqskj/archive/2013/01/11/2855715.html

robots.txt文件的解析及过滤

什么是robots.txt文件? robots.txt&#xff08;统一小写&#xff09;是一种存放于网站根目录下的ASCII编码的文本文件&#xff0c;它通常告诉网络搜索引擎的漫游器&#xff08;又称网络蜘蛛&#xff09;&#xff0c;此网站中的哪些内容是不能被搜索引擎的漫游器获取的&#xf…

CF949C Data Center Maintenance(建图+强联通分量)

题意 有 n 个信息中心&#xff0c;第 i 个信息中心要在第 ti 个小时维护&#xff0c;维护期间信息不能被获得。 每个用户的数据都有两份备份&#xff0c;第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2)。 现在要挑选一个尽量小的信息中心集合&#xff0c;使得将这个集合的维护…

fabric 启动peer_编写 Fabric 链码的一般准则

我相信智能合约(链码)是 Hyperledger Fabric 区块链网络的核心。正确开发链码可以真正发挥一个安全区块链的优势&#xff0c;反之则会带来灾难性的后果。在这篇文章里我不打算探讨 Hyperledger Fabric 链码设计的特定模式的好与坏&#xff0c;而是希望分享我在开发若干 Hyperle…

Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)

#Qt pro文件下跨平台宏的使用&#xff08;windows/linux 以及x86 和 arm的区分&#xff09; 在pro文件中添加&#xff1a; #仅在linux 系统下&#xff0c; 硬件平台无关的内容 unix{HEADERS \SOURCES \Manager.cpp \ }#arm64 的编译宏 contains(QMAKE_HOST.arch, aarch64){…

数论(一)——素数,GCD,LCM

这是一个数论系列&#xff1a;&#xff09; 一、素数 费马小定理 Theorem&#xff1a; 设 p 是一个素数,a 是一个整数且不是 p 的倍数,那么 很遗憾,费马小定理的逆定理是不成立的。对 a 2,满足的非素数 n 是存在的。 比如 n 341 11 31 对于整数 a,称满足的合数为以 a 为底的…

java自学 day1

1.数据类型 基本数据类型&#xff08;存放数据本身&#xff09; 分为数值型&#xff08;int&#xff0c;double等&#xff09; 字符型&#xff08;char&#xff09;布尔型&#xff08;boolean&#xff09; 引用数据类型&#xff08;存放数据的地址&#xff09;分为类&#xff0…

Qt下一行代码就可以使用的稳定易用的日志log类

Qt下一行代码就可以使用的稳定易用的日志类 此日志类是基于Qt 自带的 扩展的一个易用的日志类&#xff0c; 使用的是Qt自带的日志输出形式&#xff0c; 已长期运行在许多实际项目中&#xff0c;稳定可靠&#xff0c;而且跨平台&#xff0c; 在windows和linux 上都能稳定运行 …

apue读书笔记-第十二章

1 可重入&#xff0c;线程安全&#xff0c;异步信号安全之间的区别&#xff1f; 可重入&#xff1a;可以重复进入&#xff0c;不会引起问题&#xff08;这个概念最宽&#xff09; 线程安全&#xff1a;被多个线程使用时&#xff0c;不会出问题&#xff0c;也就是可以被多个进程…

取出url中的字符_如何在JavaScript中解析URL:例如主机名,路径名,查询,哈希?...

统一资源定位符&#xff08;缩写URL&#xff09;是对Web资源&#xff08;网页&#xff0c;图像&#xff0c;文件&#xff09;的引用。URL指定资源位置和检索资源的机制&#xff08;http&#xff0c;ftp&#xff0c;mailto&#xff09;。例如&#xff0c;这是此博客文章的URL&am…