WPF DataContext

简介:

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

        在 XAML 中,DataContext 通常设置为 Binding 声明。 可以使用属性元素语法或特性语法。 还可以使用代码设置 DataContextDataContext 是一种可绑定的属性,可用于在一个上下文可能绑定到另一个上下文的情况下实现。 但是,如果绑定到 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");

 

 结果:

 

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值