WPF教程(二)DataContext绑定数据(转)

本文详细介绍了WPF中DataContext的使用,DataContext作为绑定的默认源,允许指定绑定的基础。通过设置DataContext,可以在控件层次结构中传递数据,简化绑定源的定义。示例代码展示了如何在XAML和后台代码中设置DataContext,以及如何通过实现INotifyPropertyChanged接口实现数据变化时界面的实时更新。

WPF教程(二)DataContext绑定数据

(一)基础知识

DataContext属性是绑定的默认源,除非你具体指定了另外一个源,比如我们使用了ElementName属性。它由FrameworkElement类定义,大部分UI控件包括WPF窗口都继承于此类。简单地说,它允许你指定一个绑定的基。 

DateContext并没有默认源(刚开始的时候是NULL),但是它贯穿整个空间层次结构,你可以为窗口设置一个DataContext,然后在任意的子控件里面使用它。让我们用代码来举例说明:

  1.  
    Window x:Class= "WpfTutorialSamples.DataBinding.DataContextSample"
  2.  
    xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.  
    xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
  4.  
    Title= "DataContextSample" Height="130" Width="280">
  5.  
    <StackPanel Margin= "15">
  6.  
    <WrapPanel>
  7.  
    <TextBlock Text= "Window title: " />
  8.  
    <TextBox Text= "{Binding Title, UpdateSourceTrigger=PropertyChanged}" Width="150" />
  9.  
    </WrapPanel>
  10.  
    <WrapPanel Margin= "0,10,0,0">
  11.  
    <TextBlock Text= "Window dimensions: " />
  12.  
    <TextBox Text= "{Binding Width}" Width="50" />
  13.  
    <TextBlock Text= " x " />
  14.  
    <TextBox Text= "{Binding Height}" Width="50" />
  15.  
    </WrapPanel>
  16.  
    </StackPanel>
  17.  
    </Window>
  1.  
    using System;
  2.  
    using System.Windows;
  3.  
     
  4.  
    namespace WpfTutorialSamples.DataBinding
  5.  
    {
  6.  
    public partial class DataContextSample : Window
  7.  
    {
  8.  
    public DataContextSample()
  9.  
    {
  10.  
    InitializeComponent();
  11.  
    this.DataContext = this;
  12.  
    }
  13.  
    }
  14.  
    }

后台代码只添加了一行有意思的代码:在标准InitalizeComponent()调用之后,我们将“this”赋值给DataContext,这将告诉窗口我们系统窗口本身作为数据上下文。

在XAML中,我们绑定了窗口的一些属性值,如Title,Width和Height。由于窗口有一个DataContext,它可以传递给子控件,我们不再需要给每一个绑定定义一个源。如果这些属性是全局变量,直接使用它们的值就行。

运行上面的代码,然后改变窗口大小,你会发现高和宽的值会立马改变。如果编写一个不同的标题在第一个文本框里,你会发现标题并没有立即被改变。相反地,你必须将光标移动到其他控件上改变才会生效。为什么会这样?这是下一章的主题。(注:我在VS2012里面试这个例子,标题是立即实时改变的)

(二)DataContext绑定数据

在XAML中设置DataContext,注意要设置:1)引用namespace;2)设置Resources;3)设置DataContext。如下代码所示:

  1.  
    <Window x:Class= "DataContext.MainWindow"
  2.  
    xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.  
    xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
  4.  
    xmlns:local = "clr-namespace:DataContext"
  5.  
    Title= "MainWindow" Height="350" Width="525">
  6.  
    <Window.Resources>
  7.  
    <local:People x:Key= "pep" Name="Peter"/>
  8.  
    </Window.Resources>
  9.  
    <Grid>
  10.  
    <StackPanel Margin= "15">
  11.  
    <WrapPanel Margin= "0,20,0,0" Name="WrapPanel" DataContext="{StaticResource pep}">
  12.  
    <TextBox Text= "{Binding Path=Name}" Width="50" Margin="5,0"/>
  13.  
    </WrapPanel>
  14.  
    </StackPanel>
  15.  
    </Grid>
  16.  
    </Window>

或者

  1.  
    <Window x:Class= "DataContext.MainWindow"
  2.  
    xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.  
    xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
  4.  
    xmlns:local = "clr-namespace:DataContext"
  5.  
    Title= "MainWindow" Height="350" Width="525">
  6.  
    <Grid>
  7.  
    <StackPanel Margin= "15">
  8.  
    <WrapPanel Margin= "0,20,0,0" Name="WrapPanel">
  9.  
    <WrapPanel.DataContext>
  10.  
    <local:People Name= "Hyman"/>
  11.  
    </WrapPanel.DataContext>
  12.  
    <TextBox Text= "{Binding Path=Name}" Width="50" Margin="5,0"/>
  13.  
    </WrapPanel>
  14.  
    </StackPanel>
  15.  
    </Grid>
  16.  
    </Window>

或者后台绑定

  1.  
    public void Init()
  2.  
    {
  3.  
    People pep= new People ();
  4.  
    pep.Name = Peter;
  5.  
    WrapPanel.DataContext = pep; //仅WrapPanel内的所有元素可以绑定此数据
  6.  
    }

总结

使用DataContext属性就好像设置了所有绑定的基础,能够贯穿整个控件层次。这样就节省了手动为每一个绑定定义源,一旦你真正开始使用数据绑定,肯定会感激如此节省的时间。

但是,这并不意味着你必须在一个窗口里面为所有控件使用同样的DataContext。由于每一个控件都有其自己的DataContext属性,你可以很容易的打破继承链,用新值来重写DataContext。这就允许你在窗口里使用一个全局DataContext,然后在像panel这样的地方使用本地具体的DataContext,以一种独立的格式或者像上面的列出的那样。

另外,以上绑定之后当修改数据内容时界面显示并不会更改,要实现更改信息传递给用户界面,数据类必须实现INotifyPropertyChanged接口,后续章节会介绍。

转载于:https://www.cnblogs.com/LiZhongZhongY/p/10870343.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值