• 星空雅梦


    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接口,后续章节会介绍。

  • 相关阅读:
    CVTE 一面
    【玩转Ubuntu】08. Linux报错:Syntax error: "(" unexpected解决办法
    Advanced Replication同步复制实验(基于Trigger&基于Materialized View)
    centos6.4-x86-64系统更新系统自带Apache Http Server
    针对某个表使用高级复制进行数据同步示例
    [置顶] What is the difference between Category and Class Extension?
    Boxes And Balls(三叉哈夫曼编码)
    xorequation(DFS完全枚举)
    Dreamoon and MRT(二元枚举)
    矩阵链乘(解析表达式)
  • 原文地址:https://www.cnblogs.com/LiZhongZhongY/p/10870343.html
Copyright © 2020-2023  润新知