Categories: WPF 教程

WPF教程之 DataContext 控件

数据绑定:

使用DataContext

DataContext属性是绑定的默认源,除非你像我们再上一章节做的那样,使用ElementName属性单独声明了其他源。这个属性定义在FrameworkElement类中,这是包括WPF Window在内的大多数UI控件的基类。简单来说,它允许你指定绑定的源。

起始时默认DataContext 都是null. DataContext是可以通过层次关系继承下去的 . 只要Window 被设置了DataContext ,我们就能在任意的子控件里使用它. 设想这么一种情况:

<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataContextSample" Height="130" Width="280">
 <StackPanel Margin="15">
  <WrapPanel>
   <TextBlock Text="Window title:  " />
   <TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" Width="150" />
  </WrapPanel>
  <WrapPanel Margin="0,10,0,0">
   <TextBlock Text="Window dimensions: " />
   <TextBox Text="{Binding Width}" Width="50" />
   <TextBlock Text=" x " />
   <TextBox Text="{Binding Height}" Width="50" />
  </WrapPanel>
 </StackPanel>
</Window>
using System;
using System.Windows;

namespace WpfTutorialSamples.DataBinding
{
 public partial class DataContextSample : Window
 {
  public DataContextSample()
  {
   InitializeComponent();
   this.DataContext = this;
  }
 }
}

上面只在InitalizeComponent() 的后面加了一句交互代码. 我们把this赋值给DataContext,就是告诉window我们把自己作为数据源.

在XAML中,我们会把各种信息绑定到Window的多种属性上,比如Title/Width/Height. 一旦为window指定了DataContext, 我们可以在所有的子控件上向全局变量一样使用它,不用一个个的绑定.

尝试运行一下这个例子并缩放窗口,你会看到窗口大小的缩放会即时反映在文本框中。你也可以尝试在第一个文本框中输入其他标题,但你会惊奇地发现这个变化不会即时反映在窗口上。相反,你需要将焦点移至其他控件后更改才会生效。这是为什么呢?这就是下一章节的主题了。

小结

使用DataContext属性是在控件层次结构中设置所有绑定的基础。 这为您节省了为手动定义每个绑定源的麻烦,一旦您真正开始使用数据绑定,您就会体验到这个好处。

但是,这并不意味着您必须对Window中的所有控件使用相同的DataContext。 由于每个控件都有自己的DataContext属性,因此您可以轻松地破坏继承链并使用新值覆盖DataContext。 这允许你做一些事情,比如在窗口上有一个全局DataContext,然后在一个Panel上指定一个特定的DataContext上,这个Panel所有的子都使用这个特定的DataContext。

andy

前端小白,在Web176教程网这个平台跟大家一起学习,加油!

Share
Published by
andy

Recent Posts