精华内容
下载资源
问答
  • WPF DataContext

    2020-08-25 10:57:53
    如果有子元素没有通过本地值或样式建立的DataContext的其他值,则属性系统会将该值设置为已分配此值的最近父元素的DataContext值。 在 XAML 中,DataContext通常设置为Binding声明。可以使用属性元素语法或特性...

    简介:

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

     

     结果:

     

    展开全文
  • WPFDataContext

    2014-04-25 18:09:00
    1. 继承属性: DataContext is a property on FrameworkElement (base class for all WPF Controls) and is implemented as a DependencyProperty. DataContext是一个财产上的FrameworkElement的(所有WPF控件的基类...

    1. 继承属性:

    DataContext is a property on FrameworkElement (base class for all WPF Controls) and is implemented as a DependencyProperty. DataContext是一个财产上的FrameworkElement的(所有WPF控件的基类),作为DependencyProperty的实现。 That means all the descendant elements in the logical tree share the same DataContext.这意味着所有的后代元素的逻辑树中的份额相同的DataContext。

    展开全文
  • WPF-DataContext

    2017-07-11 10:49:00
    DataContext是绑定的源,每个窗口都有一个DataContext,默认情况是NULL,可以在InitializeComponent指定Context,子窗口继承父窗口的DataContext. 可以在XAML中指定DataContext的源。 转载一篇文章,解释的比较...
    • DataContext是绑定的源,每个窗口都有一个DataContext,默认情况是NULL,可以在InitializeComponent指定Context,子窗口继承父窗口的DataContext.
    • 可以在XAML中指定DataContext的源。

    转载一篇文章,解释的比较透彻:

    https://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext-you-speak-of/

    What is this “DataContext” you speak of?

    I frequently see new WPF users confused about what the DataContext is, and how it is used. Hopefully, this can help clarify what the DataContext is, and how it is used.

    What is the DataContext?

    In WPF, there are two layers to an application: the UI layer and the Data layer.

    The Data layer for an application starts out as null, and you can set it using the DataContext property. All UI objects will inherit their DataContext from their parent unless you specify otherwise.

    When using the Model-View-ViewModel (MVVM) Design Pattern, the DataContext (Data Layer) is your application, while UI objects, like Buttons, Labels, DataGrids, and even Windows, are all just user-friendly items that allow a user to easily interact with the DataContext, which is your actual application and is typically comprised of ViewModels and Models.

    How is it used

    Whenever you do a basic binding in WPF, you are binding to the DataContext.

    For example, when you write

    <Label Name="myLabel" Content="{Binding Path=Name}" />

    you are binding to myLabel.DataContext.Name, and not to myLabel.Name.

    Other binding properties, such as ElementName or RelativeSource, can be used to tell the binding to lookup the property in something other than the current DataContext.

    An Example

    Lets start with a regular Window. Without setting the DataContext, the window still displays but there is no data behind it.

    <Window x:Name="MyWindow" ...>
       ...
    </Window>

     

    Now suppose we set the DataContext to an object of type ClassA in the code-behind when this Window initializes:

    public partial class MyWindow: Window
    {
        public MyWindow()
        {
           InitializeComponent();
           this.DataContext = new ClassA();
        }
    }

     

    Now the data layer behind that the Window is an object of type ClassA.

    If ClassA has a property called Name, I could add a Label to the window and bind it to Name property of the DataContext, and whatever value is stored in ClassA.Name would get displayed.

    <Window x:Name="MyWindow" ...>
       <Label Content="{Binding Name}" />
    </Window>

     

    Now, suppose ClassA has a property called ClassB, and both classes have a property called Name. Here is a block of XAML which illustrates how the DataContext works. It also includes an example of how a control would refer to a property not in its own DataContext.

    <!-- DataContext set to ClassA in initialization code -->
    <Window x:Name="MyWindow">
     
        <!-- DataContext here is not specified, so it's inherited
             from its parent's DataContext, which is ClassA -->
        <StackPanel>
     
            <!-- DataContext inherited from parent, which is
                 ClassA, so this will display ClassA.Name -->
            <Label Content="{Binding Name}" />
     
             <!-- DataContext is still ClassA, however we are
                  setting it to ClassA.ClassB with a binding -->
            <StackPanel DataContext="{Binding ClassB}">
     
                <!-- DataContext inherited from parent, which is
                     ClassB, so this will display ClassB.Name -->
                <Label Content="{Binding Name}" />
     
                <!-- DataContext is still ClassB, but we are
                     binding to the Window's DataContext.Name,
                     which is ClassA.Name -->
                <Label Content="{Binding
                           ElementName=MyWindow,
                           Path=DataContext.Name}" />
            </StackPanel>
     
            <!-- We've left the StackPanel with its DataContext
                 bound to ClassB, so this Label's DataContext
                 is ClassA (inherited from parent StackPanel),
                 and we are binding to ClassA.ClassB.Name -->
            <Label Content="{Binding ClassB.Name}" />
        </StackPanel>
    </Window>

     

    As you can see, all the basic bindings look for their value in the data layer (DataContext) of the UI object

    Summary

    So to summarize, WPF applications have two layers: the UI layer and the Data layer. The data layer for an application starts out as null, and can be set using the DataContext property. UI objects without a DataContext set will inherit their data layer from their parent object. Bindings are used to look up values in the data layer, and display them in the UI layer.

    When using the MVVM design pattern, the data layer is your application, while the UI layer just provides a user-friendly way to access the Data layer.

     

    转载于:https://www.cnblogs.com/bingbingzhe/p/7149446.html

    展开全文
  • WPF--DataContext

    2020-06-19 20:04:33
    WPF中,应用程序有两层:UI层和Data层。这里新建一个项目说明哪些是UI层,哪些是数据层。 UI层很明显,就是用户看到的界面。但是数据层并不是下图所示: 上图中是UI层view的后台代码。当然,你可以使用事件的方式...

    在WPF中,应用程序有两层:UI层和Data层。这里新建一个项目说明哪些是UI层,哪些是数据层。

    UI层很明显,就是用户看到的界面。但是数据层并不是下图所示:

    上图中是UI层view的后台代码。当然,你可以使用事件的方式把所有的业务逻辑代码写到这里,但是我们采用MVVM的时候业务逻辑是与这里解耦的,数据层是DataContext,此时并没有指定。
    接下来我们新建个目录,然后添加个类文件:

    然后指定VM类为DataContext:

    此时我们才算为MVVM模式的wpf应用程序创建了数据层,也就是MainViewModel类。

    默认,应用程序的数据层(DataContext)是null,我们可以使用DataContext属性对其进行设置。
    除非另行指定,否则所有UI对象都将从其父对象继承其DataContext
    实际上DataContext才算是我们的实际应用程序(业务逻辑),他通常由ViewModels和Models组成。
    UI对象(如按钮,标签,DataGrids甚至Windows)实际作用是允许用户轻松与DataContext交互。
    当你写<Label Name="myLabel" Content="{Binding Path=Name}" />你是绑定到myLabel.DataContext.Name,而不是myLabel.Name。

    <!-- 注意此时我已经在初始化代码中设置DataContext 为 ClassA,DataContext = new ClassA  -->
    <Window x:Name="MyWindow"> 
     
        <!-- DataContext 没有被指定,所以继承自父类
             的 DataContext,也就是 ClassA -->
        <StackPanel> 
     
            <!-- DataContext 继承自父类,也就是 
                 ClassA, 所以这里会显示 ClassA.Name -->
            <Label Content="{Binding Name}" />
     
             <!-- DataContext 仍然是ClassA, 但是我们通过binding设置为ClassA.ClassB-->
            <StackPanel DataContext="{Binding ClassB}">
     
                <!-- DataContext 继承自父类,也就是ClassB,所以这里会显示 ClassB.Name -->
                <Label Content="{Binding Name}" />
     
                <!-- DataContext i仍然是 ClassB, 但是我们binding 到了Window's DataContext.Name, 也就是 ClassA.Name -->
                <Label Content="{Binding 
                           ElementName=MyWindow, 
                           Path=DataContext.Name}" /> 
            </StackPanel>
     
            <!-- We've left the StackPanel with its DataContext 
                 bound to ClassB, so this Label's DataContext 
                 is ClassA (inherited from parent StackPanel), 
                 and we are binding to ClassA.ClassB.Name -->
            <Label Content="{Binding ClassB.Name}" />
        </StackPanel>
    </Window>
    

    所有基本绑定都在UI对象的数据层(DataContext)中寻找它们的值。
    综上所述,WPF应用程序具有两层:UI层和数据层。应用程序的数据层以null开头,可以使用DataContext属性设置。未设置DataContext的UI对象将从其父对象继承其数据层。绑定用于在数据层中查找值,并在UI层中显示它们。
    使用MVVM设计模式时,数据层是您的应用程序,而UI层只是提供了一种用户友好的方式来访问数据层。

    datacontext的绑定

    pis:(直接在XAML上指定根datacontext貌似不行,必须通过代码或者引入资源(此方式还未实践)的方式来指定,后续子元素的datacontext可以通过binding来指定则是可行的,它们的根都是之前设定的根datacontext)
    可以在view的后台代码中手动指定例如在构造函数中:

    var cont = new MainViewModle();
    DataContext = cont;
    

     

    另外也可以写到资源中,首先需要写一个viewmodel类:

    public MainViewModel()
    {
        plusCommand = new PlusCommand(this);
    }
    

     

    然后把vm类放到资源中:

    <!--需要指定名称空间vm:
    xmlns:vm="clr-namespace:SimpleCommandDemoApp.ViewModels"-->
    <UserControl.Resources>
        <vm:CalculatorViewModel x:Key="calculatorVM" />
    </UserControl.Resources>
    

     

    最后就可以在xaml中指定了:

    DataContext="{Binding Source={StaticResource calculatorVM}}"
    

     

    WPF使用DataContext将数据层与UI层实现了解耦,那么他们之间是如何交互的?实际上上面已经略有涉猎,那就是Binding,上面实例的ClassA、ClassB的Name就是通过Binding来展示到UI上的,详细介绍在下一篇文章中再做说明。

    展开全文
  • <div><p>We now subscribe to the ...DataContext is always in sync with the outside <p>This is a follow-up of the discussion in #54 </p><p>该提问来源于开源项目:videolan/libvlcsharp</p></div>
  • 给目标DataContext节点一个Name <StackPanel DataContext="{Binding ElementName=mylist, Path=DataContext}"> <Button Command="{Binding DeleteItemCmd}" Content="删
  • WPF中,应用程序有两层:UI层和Data层。这里新建一个项目说明哪些是UI层,哪些是数据层。UI层很明显,就是用户看到的界面。但是数据层并不是下图所示: 上图中是UI层view的后台代码。当然,你可以使用事件的方式把...
  • WPF学习笔记——DataContext 与 ItemSource
  • WPFDataContext(转)

    2016-05-23 15:33:00
    WPFDataContext(转) 有时候不是你不够聪明,而是别人教给你的东西太烂!相信自己! 这是我认为,目前网络上对“DataContext”解释最好的一篇文章,跟大家分享。 原文地址:...
  • WPF入门(1)——DataContextWPF中,应用程序有两层:UI层和Data层。这里新建一个项目说明哪些是UI层,哪些是数据层。 UI层很明显,就是用户看到的界面。但是数据层并不是下图所示: 上图中是UI层view的后台代码...
  • WPF 中 数据绑定 ItemSource和 DataContext的不同点: 1.DataContext 一般是一个非集合性质的对象,而ItemSource 更期望数据源是 集合对象。 2.DataContext 是 FrameworkElement 类中定义的一个依赖属性...
  • 如上图,红框是frame控件,蓝框是用户控件 ... 给设的默认值是能正常显示的。表示已经绑定成功了。我现在MainWindoe用DataContext...WPF小白真的搞懵逼了,为了实时刷新用户控件这个数据弄了两天了~就是死活不刷新。
  • WPF中有许多时候绑定到同一个对象上,因此就有一个隐式的数据源DataContext,有时把一个父控件直接设置成DataContext,当一个控件没有显示源对象时,WPF会遍历整个逻辑树,找到一个非空的Datacontext属性绑定上去...
  • wpfDataContext当绑定MainWindow时,会出错:![图片说明](https://img-ask.csdn.net/upload/202002/21/1582260419_673587.png) 但是如果新建一个类的话去绑定就没问题。这是为什么?代码如下: ![图片说明]...
  • wpfdatacontext问题。

    2016-12-06 10:12:36
    新接触wpfdatacontext指向很不理解。。 this.datacontext = new ClassA() 这是什么意思 datacontext指向一个新的classA的实例? 是不是UI层控件的属性的binding的path就能指向这个ClassA实例的属性了呢 那这个...
  • wpf——数据绑定DataContext

    千次阅读 2014-07-31 14:51:31
    恩,前几天初学wpf,最难得就是ban
  • DataContext 一般翻译就是数据上下文的意思。大概的意思就是说这个DataContext会影响某个范围内的对象的某些属性 在数据绑定中这个DataContext也比较有意思 之前我们绑定数据源的时候,在绑定每一个数据目标的...
  • namespace DataContext_ItemSource_Demo { public class Person { public string Name; } public class ViewModel { public MainWindow win; public Pers...
  • 1. 窗体的XAML设置DataContext view 1 <Window x:Class="MVVM_Binding_ViewModelMainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://sche...
  •  例如下边代码,textBox1绑定textBlock2的Text属性的时候,数据上下文就是Grid或者Grid父容器的DataContext,上下文中能用到就是界面元素的属性。 二、可以在任何时候显式设置上下文,但是设置上下文以后绑定才...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 514
精华内容 205
关键字:

datacontextwpf