一、如果没有显式设置上下文,那么数据上下文就是界面
例如下边代码,textBox1绑定textBlock2的Text属性的时候,数据上下文就是Grid或者Grid父容器的DataContext,上下文中能用到就是界面元素的属性。
二、可以在任何时候显式设置上下文,但是设置上下文以后绑定才会有效。
设置方法是ctlId.DataContext = xxx,例如grid1.DataContext = this;
三、可以在XAML中设置上下文
在XAML中设置DataContext,有三点要设置:1)引用namespace;2)设置Resources;
<Window x:Class="WpfAppDemo1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:WpfAppDemo1"
Title="MainWindow" Height="350" Width="525">
<Grid Name="grid1">
<Grid.Resources>
<c:MyData x:Key="myData1" />
</Grid.Resources>
<Grid.DataContext>
<Binding Source="{StaticResource myData1}" />
</Grid.DataContext>
<TextBox Height="23" HorizontalAlignment="Left" Margin="123,30,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=MyName}" />
</Grid>
一、如果没有显式设置上下文,那么数据上下文就是界面 例如下边代码,textBox1绑定textBlock2的Text属性的时候,数据上下文就是Grid或者Grid父容器的DataContext,上下文中能用到就是界面元素的属性。二、可以在任何时候显式设置上下文,但是设置上下文以后绑定才会有效。 设置方法是ctlId.DataContext = xxx,例如grid1.DataC...
oneWay:使用 OneWay 绑定时,每当源发生变化,数据就会从源流向目标。
OneTime: 绑定也会将数据从源发送到目标;但是,仅当启动了应用程序或 DataContext 发生更改时才会如此操作,因此,它不会侦听源中的更改通知。
OneWayToSource: 绑定会将数据从目标发送到源。
TwoWay: 绑定会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。
Default: binding的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay.
上面的例子不设Mode时,默认的就是Default.
1.使用ObservableCollection 来声明这个数据集合,不能使用ListT<T>或者Dictionary<TKey,TValue>。Observable意味着MVVM中的View可以观察你的集合对象。当我们数据集合变化时,界面会发生相应的变化。
2.实现一个INotifyPropertyChanged的接口,这样我们的属性改变时,才会通知界面。
3.每一个WPF中的控件都有一个DataContext属性,集合控件会有一个ItemSource的属性,这些属性都可以让我们去绑定数据。
前一段半心半意地学习了一下WPF,是从控件入手的,发现巨容易,甚至有些无趣。昨天面试,被问到了很多WPF的特性的东西,直接就傻了。于是乎,还是要去深刻的学习一下WPF。刚刚试了一下数据绑定,几次都没有成功,后来发现是DataContext搞得鬼。
我暂时有两点结论:
1、如果没有显式设置上下文,那么数据上下文就是界面;
例如下边代码,textBox1绑定textBlock2的Text...
关键的地方是,下面第3行,需要把当前的上下文传递到Content,生成绑定的ContentTemplate才能获取到绑定在UserControl的DataContext
<Style TargetType="UserControl">
按照现在网上关于
DataContext的普遍说法,
WPF的UI是树状的,每个节点都是控件,所以每个节点都有
DataContext属性,如果一个Binding找不到自己的Source那他就会沿着这个UI树一直往上找,直到找到和Path对应的那个属性,如果到最外层也没找到,那就没有
数据源。
可我发现好像并不像是这样,下面用一个例子来说明吧。
新建一个类,为Human.cs
using System;
1、当为
ContextMenu指定
DataContext时,因为
ContextMenu属于弹出层,在VisualTree中与所在的设计视图已经分离,所以无法将
DataContext绑定到任何父级元素,即使整个视图已指定了
DataContext,也无法设置MenuItem的Command,也就是说,一下几种方式都是无效的,均不能触发菜单项的Command:
<UserControl x:Class="....."
x:Name="TestView">
DataContext属性是绑定的默认源,除非你具体指定了另外一个源,就像上一章里面我们使用了ElementName属性。它由FrameworkElement类定义,大部分UI控件包括WPF窗口都继承于此类。简单地说,它允许你指定一个绑定的基。
DateContext并没有默认源(刚开始的时候是NULL),但是它贯穿整个空间层次结构,你可以为窗口设置一个DataContext,然后在任意的子控件
在
WPF中,应用程序有两层:UI层和
Data层。这里新建一个项目说明哪些是UI层,哪些是
数据层。
UI层很明显,就是用户看到的界面。但是
数据层并不是下图所示:
上图中是UI层view的后台代码。当然,你可以使用事件的方式把所有的业务逻辑代码写到这里,但是我们采用MVVM的时候业务逻辑是与这里解耦的,
数据层是
DataContext,此时并没有指定。
接下来我们新建个目录,然后添加个类文件:
然后指定VM类为
DataContext:
此时我们才算为MVVM模式的wp
本文详细讲述了WPF绑定的用法,分享给大家供大家参考。具体用法分析如下:
1.WPF绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了Xaml扩展标记,WPF绑定一个控件是使用Binding.ElementName,绑定非控件对象时使用Source,RelativeSource,DataContext属性(WPF特有,而非XAML),只能绑定对象的共有字段.
下边是部分Binding 属性名,完整列表参考 :http://msdn.microsoft.com/zh-cn/library/vstudio/ms750413.aspx
① Source:
笔记2:WPFCommand命令使用1、列表按钮绑定事件使用2、Command命令绑定传递指定控件对象
1、列表按钮绑定事件使用
Command=”{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.But_click}” CommandParameter=”{Binding Name,Mode=TwoWay}”
绑定按钮点击Command,找到对象的父级容器,类型指定为ListBox,触发事件为DataContext
<Window x:Class="UserStore.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindo
```xml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<TextBox Text="{Binding Name}" />
<TextBox Text="{Binding Age}" />
</Grid>
</Window>
3. 在代码中创建数据模型实例,并将其赋值给控件的DataContext属性,例如:
```csharp
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
DataContext = new Person { Name = "John", Age = 30 };
这样,当用户修改文本框中的内容时,数据模型中的属性值也会随之改变,反之亦然。
C# 基础(二十八)C#的值类型(int/string/结构体集合为值类型)和引用类型(泛型集合为引用类型):自定义类泛型集合类型是引用类型。将自定义类改为自定义结构体,从而变成值类型,以便备份数据。
冷静的平头哥:
MVVMLight(一)入门教程、WPF使用MVVMLitht教程。
不能再留遗憾了:
(七)WPFC# 视频监控画面的传输:使用Aforge类库打开USB摄像头循环采集每一帧图像给Socket传输,并解决粘包、拆包问题
qq_45687903:
(二)远程桌面连接,实现一个电脑远程控制另一个电脑:关闭防火墙、ping通IP、允许远程连接、输入用户名及密码
我爱AI:
(二)远程桌面连接,实现一个电脑远程控制另一个电脑:关闭防火墙、ping通IP、允许远程连接、输入用户名及密码
m0_69243526:
python自动化办公(三十二)pyinstaller.exe打包成exe程序,运行后ModuleNotFoundError或FileNoFounderError:no such file or **
python自动化办公(三十一)TKinter 先登录授权窗口,授权成功后进入master主窗口
python自动化办公(三十)TKinter master主窗口的Frame之间通信:实例化一个全局类,以便注册所有的Frame