首页 > 其他分享 >【转】WPF DataContext

【转】WPF DataContext

时间:2022-11-24 16:23:28浏览次数:66  
标签:控件 DataContext 绑定 元素 设置 PersonNP WPF

简介:

        获取或设置元素参与数据绑定时的数据上下文。数据上下文是一种概念,允许元素从父元素继承有关用于绑定的数据源以及绑定的其他特征(如路径)的信息。此依赖属性继承属性值。 如果有子元素没有通过本地值或样式建立的 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");

 

 结果:

 

转自 https://blog.csdn.net/C_gyl/article/details/108214640

标签:控件,DataContext,绑定,元素,设置,PersonNP,WPF
From: https://www.cnblogs.com/castlewu/p/16922247.html

相关文章

  • WPF表单验证
    摘要WPF表单验证是WPF重要基础设施之一,依靠MVVM的数据绑定机制及微软的有力封装,使得我们在处理实体表单验证等可以快捷高效的灵活处理。常见的表单验证实现大概有Exceptio......
  • 【转】WPF 中双向绑定通知机制之OBSERVABLECOLLECTION使用
    WPF中双向绑定通知机制之ObservableCollection使用msdn中  ObservableCollection<T> 类  表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将......
  • wpf 子页面调用父窗口方法
     参考:http://www.360doc.com/content/17/1113/11/24811_703389993.shtml//1)子页面后台定义委托(namespace下class外)//定义委托internaldelegatevoidColorChange(o......
  • wpf 后台添加控件
    音乐播放列表,鼠标右键点击列表时,出现添加到歌单,做成每次右键点击时,后台新增选项了(也可以前台绑定数据源每次增删改后更新数据源)TextBlocktext=newTextBlock();text.......
  • wpf 后台修改控件颜色(颜色Brush类型新建)
    16进制、rgb格式、提供的颜色示例:xxx.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#FFFFFF"));xxx.Background=newSolidColorBrus......
  • WPF-简单数据绑定
    为了保持数据和控件内容的同步,我们通常的方法是在:数据类中创建事件,在属性修改时通知控件修改内容;在控件所属类中创建事件,在内容修改时通知数据对象更新属性,这叫做数据绑定......
  • 在WPF中利用XPS文档实现打印功能
    摘要WPF重新规划了打印模型,将所有编码围绕System.Windows.Controls.PrintDialog,使用PrintDialog类可显示Print对话框、设置打印机首选项等等,并且可将元素、文档以及低级的......
  • C# WPF ListBox 最后追加项自动滚动到最后一项 ScrollIntoView
    用这个:lstbDynamicNote.ScrollIntoView(lstbDynamicNote.Items[lstbDynamicNote.Items.Count-1]);privatevoidDynamicNoteShow(stringdynamicNote){if(lstb......
  • WPF主窗口在项目子文件夹中如何启动
    在Application类中带上相对路径就行了......
  • 手把手教你如何用界面组件DevExpress WPF应用一个模板主题
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专......