【转】WPF DataContext
简介:
获取或设置元素参与数据绑定时的数据上下文。数据上下文是一种概念,允许元素从父元素继承有关用于绑定的数据源以及绑定的其他特征(如路径)的信息。此依赖属性继承属性值。 如果有子元素没有通过本地值或样式建立的 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!