简介:
获取或设置元素参与数据绑定时的数据上下文。数据上下文是一种概念,允许元素从父元素继承有关用于绑定的数据源以及绑定的其他特征(如路径)的信息。此依赖属性继承属性值。 如果有子元素没有通过本地值或样式建立的 DataContext 的其他值,则属性系统会将该值设置为已分配此值的最近父元素的 DataContext 值。
在 XAML 中,DataContext 通常设置为 Binding 声明。 可以使用属性元素语法或特性语法。 还可以使用代码设置 DataContext。DataContext 是一种可绑定的属性,可用于在一个上下文可能绑定到另一个上下文的情况下实现。 但是,如果绑定到 DataContext,请注意不要创建循环绑定引用(不将 DataContext 绑定到其自身,因为 DataContext 属性的属性值继承特性)。
使用:
- public class PersonNP:INotifyPropertyChanged
- {
- public event PropertyChangedEventHandler PropertyChanged;
-
- private string name;
- public string Name
- {
- get { return name; }
- set { name = value; Notify(); }
- }
-
- private void Notify([CallerMemberName]string obj ="")
- {
- if (PropertyChanged != null)
- {
- this.PropertyChanged (this, new PropertyChangedEventArgs(obj));
- }
- }
- }
6种方法绑定DataContext
1.方法①,后台实例化
- private PersonNP pNP;
- public MainWindow()
- {
- InitializeComponent();
- pNP = new PersonNP
- {
- Name = "test"
- };
- this.DataContext = pNP; //DataContext设置
- }
2.方法②,DataContext设置
系统默认查找父元素控件的DataContext,不直接声明使用父元素的DataContext。亦可以在其它父元素上声明DataContext。
- <Window.DataContext>
- <local:PersonNP Name="test"/>
- </Window.DataContext>
- <Grid>
- <StackPanel>
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
- <TextBlock Text="{Binding Path=Name}"></TextBlock>
- </StackPanel>
- </Grid>
- <Grid>
- <StackPanel>
- <StackPanel.DataContext>
- <local:PersonNP Name="test"/>
- </StackPanel.DataContext>
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
- <TextBlock Text="{Binding Name}"></TextBlock>
- </StackPanel>
- </Grid>
3.方法③,Resources设置
声明为Resources作为DataContext,系统默认查找父元素的DataContext。亦可以在其它父元素上声明DataContext。
- <Window.Resources>
- <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
- </Window.Resources>
- <Grid>
- <StackPanel DataContext="{StaticResource p}">
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
- <TextBlock Text="{Binding Path=Name}"></TextBlock>
- </StackPanel>
- </Grid>
- <Grid>
- <StackPanel>
- <StackPanel.Resources>
- <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
- </StackPanel.Resources>
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" DataContext="{StaticResource p}"></TextBox>
- <TextBlock Text="{Binding Path=Name}" DataContext="{StaticResource p}"></TextBlock>
- </StackPanel>
- </Grid>
1.方法④,查找父元素控件的DataContext
指定查找父元素的类型,即是StackPanel设置的DataContext。
- <Window.Resources>
- <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
- </Window.Resources>
- <Grid>
- <StackPanel DataContext="{StaticResource p}">
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
- <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}},Path=DataContext.Name}"></TextBlock>
- </StackPanel>
- </Grid>
2.方法⑤,查找自身控件的DataContext
虽然没有显式设置,但是系统默认会查找父元素控件的DataContext。
- <Window.Resources>
- <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
- </Window.Resources>
- <Grid>
- <StackPanel DataContext="{StaticResource p}">
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
- <TextBlock Text="{Binding RelativeSource={RelativeSource Self},Path=DataContext.Name}"></TextBlock>
- </StackPanel>
- </Grid>
3.方法⑥,分别设置控件的DataContext
每个控件分别设置DataContext,但都需要指定ResourceKey,确认DataContext对象是相同的。
- <Window.Resources>
- <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
- </Window.Resources>
- <Grid>
- <StackPanel>
- <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
- <TextBox.DataContext>
- <StaticResource ResourceKey="p"/>
- </TextBox.DataContext>
- </TextBox>
- <TextBlock Text="{Binding Name}">
- <TextBlock.DataContext>
- <StaticResource ResourceKey="p"/>
- </TextBlock.DataContext>
- </TextBlock>
- </StackPanel>
- </Grid>
简写:
如下两种写法是等价的。
<StackPanel DataContext="{StaticResource p}">
<StackPanel DataContext="{Binding Source={StaticResource ResourceKey=p}}">
Source:
1.一般指定特定的Resources。
- <Window.Resources>
- <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
- </Window.Resources>
2 后台获取前台设置的Resource
PersonNP p =(PersonNP)this.FindResource("p");
结果:
转自 https://blog.csdn.net/C_gyl/article/details/108214640 标签:控件,DataContext,绑定,元素,设置,PersonNP,WPF From: https://www.cnblogs.com/castlewu/p/16922247.html