WPF数据绑定之DataContext

本文介绍了WPF中DataContext的概念,用于数据绑定,并详细阐述了6种设置DataContext的方式,包括后台实例化、资源设置、查找父元素和自身控件的DataContext,以及分别设置每个控件的DataContext。
摘要由CSDN通过智能技术生成

简介:

        获取或设置元素参与数据绑定时的数据上下文。数据上下文是一种概念,允许元素从父元素继承有关用于绑定的数据源以及绑定的其他特征(如路径)的信息。此依赖属性继承属性值。 如果有子元素没有通过本地值或样式建立的 DataContext 的其他值,则属性系统会将该值设置为已分配此值的最近父元素的 DataContext 值。

        在 XAML 中,DataContext 通常设置为 Binding 声明。 可以使用属性元素语法或特性语法。 还可以使用代码设置 DataContextDataContext 是一种可绑定的属性,可用于在一个上下文可能绑定到另一个上下文的情况下实现。 但是,如果绑定到 DataContext,请注意不要创建循环绑定引用(不将 DataContext 绑定到其自身,因为 DataContext 属性的属性值继承特性)。

 

使用:


   
   
  1. public class PersonNP: INotifyPropertyChanged
  2. {
  3. public event PropertyChangedEventHandler PropertyChanged;
  4. private string name;
  5. public string Name
  6. {
  7. get { return name; }
  8. set { name = value; Notify(); }
  9. }
  10. private void Notify([CallerMemberName]string obj ="")
  11. {
  12. if (PropertyChanged != null)
  13. {
  14. this.PropertyChanged ( this, new PropertyChangedEventArgs(obj));
  15. }
  16. }
  17. }

 

6种方法绑定DataContext

1.方法①,后台实例化


   
   
  1. private PersonNP pNP;
  2. public MainWindow()
  3. {
  4. InitializeComponent();
  5. pNP = new PersonNP
  6. {
  7. Name = "test"
  8. };
  9. this.DataContext = pNP; //DataContext设置
  10. }

 

 2.方法②,DataContext设置

系统默认查找父元素控件的DataContext,不直接声明使用父元素的DataContext。亦可以在其它父元素上声明DataContext。


   
   
  1. <Window.DataContext>
  2. <local:PersonNP Name="test"/>
  3. </Window.DataContext>
  4. <Grid>
  5. <StackPanel>
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"> </TextBox>
  7. <TextBlock Text="{Binding Path=Name}"> </TextBlock>
  8. </StackPanel>
  9. </Grid>

   
   
  1. <Grid>
  2. <StackPanel>
  3. <StackPanel.DataContext>
  4. <local:PersonNP Name="test"/>
  5. </StackPanel.DataContext>
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"> </TextBox>
  7. <TextBlock Text="{Binding Name}"> </TextBlock>
  8. </StackPanel>
  9. </Grid>

 

3.方法③,Resources设置

声明为Resources作为DataContext,系统默认查找父元素的DataContext。亦可以在其它父元素上声明DataContext。


   
   
  1. <Window.Resources>
  2. <local:PersonNP x:Key="p" Name="test"> </local:PersonNP>
  3. </Window.Resources>
  4. <Grid>
  5. <StackPanel DataContext="{StaticResource p}">
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"> </TextBox>
  7. <TextBlock Text="{Binding Path=Name}"> </TextBlock>
  8. </StackPanel>
  9. </Grid>

   
   
  1. <Grid>
  2. <StackPanel>
  3. <StackPanel.Resources>
  4. <local:PersonNP x:Key="p" Name="test"> </local:PersonNP>
  5. </StackPanel.Resources>
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" DataContext="{StaticResource p}"> </TextBox>
  7. <TextBlock Text="{Binding Path=Name}" DataContext="{StaticResource p}"> </TextBlock>
  8. </StackPanel>
  9. </Grid>

 

1.方法④,查找父元素控件的DataContext

指定查找父元素的类型,即是StackPanel设置的DataContext。


   
   
  1. <Window.Resources>
  2. <local:PersonNP x:Key="p" Name="test"> </local:PersonNP>
  3. </Window.Resources>
  4. <Grid>
  5. <StackPanel DataContext="{StaticResource p}">
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"> </TextBox>
  7. <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}},Path=DataContext.Name}"> </TextBlock>
  8. </StackPanel>
  9. </Grid>

 

2.方法⑤,查找自身控件的DataContext

虽然没有显式设置,但是系统默认会查找父元素控件的DataContext。 


   
   
  1. <Window.Resources>
  2. <local:PersonNP x:Key="p" Name="test"> </local:PersonNP>
  3. </Window.Resources>
  4. <Grid>
  5. <StackPanel DataContext="{StaticResource p}">
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"> </TextBox>
  7. <TextBlock Text="{Binding RelativeSource={RelativeSource Self},Path=DataContext.Name}"> </TextBlock>
  8. </StackPanel>
  9. </Grid>

 

3.方法⑥,分别设置控件的DataContext

每个控件分别设置DataContext,但都需要指定ResourceKey,确认DataContext对象是相同的。


   
   
  1. <Window.Resources>
  2. <local:PersonNP x:Key="p" Name="test"> </local:PersonNP>
  3. </Window.Resources>
  4. <Grid>
  5. <StackPanel>
  6. <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
  7. <TextBox.DataContext>
  8. <StaticResource ResourceKey="p"/>
  9. </TextBox.DataContext>
  10. </TextBox>
  11. <TextBlock Text="{Binding Name}">
  12. <TextBlock.DataContext>
  13. <StaticResource ResourceKey="p"/>
  14. </TextBlock.DataContext>
  15. </TextBlock>
  16. </StackPanel>
  17. </Grid>

 

简写: 

如下两种写法是等价的。

 <StackPanel DataContext="{StaticResource p}">
   
   
 <StackPanel DataContext="{Binding Source={StaticResource ResourceKey=p}}">
   
   

 

Source:

1.一般指定特定的Resources。


   
   
  1. <Window.Resources>
  2. <local:PersonNP x:Key="p" Name="test"> </local:PersonNP>
  3. </Window.Resources>

 

2 后台获取前台设置的Resource

PersonNP p =(PersonNP)this.FindResource("p");
   
   

 

 结果:

 

`在这里插入代码片`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值