WEB开发网
开发学院WEB开发ASP.NET WPF学习笔记9. Binding (2) 阅读

WPF学习笔记9. Binding (2)

 2010-10-11 16:23:12 来源:本站整理   
核心提示:5. DataContext 共享源在上面的例子中,我们需要将同一资源绑定到多个 UI 元素上,WPF学习笔记9. Binding (2)(3),很显然到处写 "{Binding Source={StaticResource personals}}" 是件很繁琐且不利于修改的做法,WPF 提供了一个

5. DataContext 共享源

在上面的例子中,我们需要将同一资源绑定到多个 UI 元素上,很显然到处写 "{Binding Source={StaticResource personals}}" 是件很繁琐且不利于修改的做法。WPF 提供了一个称之为 "数据上下文 (DataContext)" 的东西让我们可以在多个元素上共享一个源对象,只需将其放到父元素 DataContext 属性即可。

<Window x:Class="Learn.WPF.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:my="clr-namespace:Learn.WPF"
  Title="Window1">
  <Window.Resources>
    <my:PersonalList x:Key="personals" >
      <my:Personal Name="Tom" Age="10" Sex="Male" />
      <my:Personal Name="Mary" Age="15" Sex="Female" />
      <my:Personal Name="Jack" Age="12" Sex="Male" />
    </my:PersonalList>
  </Window.Resources>
  <Grid>
    <StackPanel DataContext="{StaticResource personals}">
      <ListBox x:Name="listbox1"
        ItemsSource="{Binding}"
        DisplayMemberPath="Name"
        IsSynchronizedWithCurrentItem="True">
      </ListBox>

      <Label x:Name="lblName" Content="{Binding Path=Name}" />
      <Label x:Name="lblAge" Content="{Binding Path=Age}"/>
      <Label x:Name="lblSex" Content="{Binding Path=Sex}"/>
    </StackPanel>
  </Grid>
</Window>

当我们不给 Binding 扩展标志指定 Source 属性时,它会自动寻找上级父元素的数据上下文。

当然,我们也可以在代码中做同样的事情。

Window1.xaml

<Window x:Class="Learn.WPF.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:my="clr-namespace:Learn.WPF"
  Title="Window1">
  <Grid>
    <StackPanel x:Name="stackPanel1">
      <ListBox x:Name="listbox1"
        ItemsSource="{Binding}"
        DisplayMemberPath="Name"
        IsSynchronizedWithCurrentItem="True">
      </ListBox>

      <Label x:Name="lblName" Content="{Binding Path=Name}" />
      <Label x:Name="lblAge" Content="{Binding Path=Age}"/>
      <Label x:Name="lblSex" Content="{Binding Path=Sex}"/>
    </StackPanel>
  </Grid>
</Window>

Window1.xaml.cs

public partial class Window1 : Window
{
  public Window1()
  {
    InitializeComponent();
    var list = new PersonalList {
     new Personal{Name="Tom", Age=10, Sex="Male"},
     new Personal{Name="Mary", Age=15, Sex="Female"},
     new Personal{Name="Jack", Age=12, Sex="Male"},
    };
    this.stackPanel1.DataContext = list;
  }
}

从上面的例子中,我们可以看出使用 DataContext 使得数据和 UI 分离更加灵活,因为 DataContext 可以跨越多级父元素。比如我们可以直接将数据源设置为 Window.DataContext。

public partial class Window1 : Window
{
  public Window1()
  {
    ... ...
    this.DataContext = list;
  }
}

上一页  1 2 3 

Tags:WPF 学习 笔记

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接