WPF的Binding学习笔记(三)

简介: 在笔记(一)中记了点Binding的Path相关, 因为Binding的带参构造器就只有Path的参数. 所以Path是很重要的, 有了Path, 即使在没有指定Source的时候, Binding也会随着UI元素树一层一层往外找DataContext对象, 判断是否具有相应的Path, 有就拿来用.

在笔记(一)中记了点Binding的Path相关, 因为Binding的带参构造器就只有Path的参数.

所以Path是很重要的, 有了Path, 即使在没有指定Source的时候, Binding也会随着UI元素树一层一层往外找DataContext对象, 判断是否具有相应的Path, 有就拿来用.

一, DataContext属性与Binding

笔记(一)中的Binding, 除了控件间的Binding, 其他都是在C#代码处完成的.

如何在XAML中Binding那些在C#中定义的实例呢?

方法之一就是使用DataContext.

1, 准备一个类

public class Student
{
    public Student(string id, string name, int age)
    {
        this.Name = name;
        this.Id = id;
        this.Age = age;
    }
    public string Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

2, 实例化, 然后赋值给窗体的DataContext

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        Student stu = new Student("101", "巴尔扎克", 16);
        this.DataContext = stu ; 
    }
}

3, 准备XAML

<StackPanel>
    <TextBlock Text="{Binding Id}" Margin="5" />
    <TextBlock Text="{Binding Name}" Margin="5" />
    <TextBlock Text="{Binding Age}" Margin="5" />
</StackPanel>

运行, 出现如下界面

这样就成功了.

于是我朋友说, 那我直接把窗体自己做自己的DataContext, 然后定义的那些属性都能找到?

汗, 还真是能找到. 于是他说, 那如果我有多个数据源要分别Binding, 就多准备一些窗体的属性, 那XAML那边写起来就简单了.

汗, 效果的确是能实现, 其他的不谈...

下面来试一下

4, 添加window1的属性并修改实例化部分的代码

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        stu = new Student("101", "巴尔扎克", 16);//这边实例化后赋值的对象是属性
        this.DataContext = this;//这里改成this了
    }
    public Student stu { get; set; }
}

5, 修改XAML处的Binding

<StackPanel>
    <TextBlock Text="{Binding stu.Id}" Margin="5" />
    <TextBlock Text="{Binding stu.Name}" Margin="5" />
    <TextBlock Text="{Binding stu.Age}" Margin="5" />
</StackPanel>

F5运行, 成功

当然, 在上述示例中如果使用StackPanel的DataContext的话也行.

看到这里是否会觉得很奇怪, 好像跟路由事件的冒泡路由很像?

可惜, 冒泡路由是主动的, 而Binding才能这么牛, 只是作为依赖属性没显示指定DataContext的控件会自动使用其容器的DataContext而已.

测试开始!

还是上面的示例, XAML处给StackPanel指定一个Name="stackPanel", 然后把C#处指定DataContext部分的代码修改如下

public Window1()
{
    InitializeComponent();
    stu = new Student("101", "巴尔扎克", 16);
    this.DataContext = this;
    string strBuf = "Wahahaahaha";
    stackPanel.DataContext = strBuf;
}

F5运行, 发现空白一片...因为这些TextBlock使用的是上一级节点的DataContext, 而StackPanel的DataContext是个string类型, 没有Path想要的...残念了

 

突然想到一个很诡异的情况, 就是DataContext正好就是需要类型, 比如正好是string

那么就会出现

<TextBlock Text="{Binding}" Margin="5" />

这样诡异的Binding, 此后再遇也就不奇怪啦~

 

 

 

目录
相关文章
|
8月前
|
存储 自然语言处理 C#
WPF技术之Binding
WPF(Windows Presentation Foundation)是微软推出的一种用于创建应用程序用户界面的框架。Binding(绑定)是WPF中的一个重要概念,它用于在界面元素和数据源之间建立关联。通过Binding,可以将界面元素(如文本框、标签、列表等)与数据源(如对象、集合、属性等)进行绑定,从而实现数据的双向传递和同步更新。
143 2
WPF技术之Binding
|
3月前
|
C#
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
69 1
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
|
3月前
|
C#
halcon联合c#、WPF学习笔记二(简单案例)
halcon联合c#、WPF学习笔记二(简单案例)
106 0
|
3月前
|
C# C++
halcon联合c#、WPF学习笔记一(WPF配置halcon)
halcon联合c#、WPF学习笔记一(WPF配置halcon)
120 1
|
C#
WPF中Binding使用StringFormat格式化字符串方法
原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 // $123.46 货币格式,一位小数 // $123.5 前文字 //单价:$123.
2197 0
|
8月前
|
C#
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
82 0
|
算法 程序员 C#
【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来说可算是相当有难度了,首先我是个Java Web开发程序员,从来没正经地学过微软的开发语言和工具;其次,对于算法这种东西,向来有种天生的排斥,一看便头疼。
1693 0
|
C#
解答WPF中ComboBox SelectedItem Binding不上的Bug
原文:解答WPF中ComboBox SelectedItem Binding不上的Bug 正在做一个打印机列表,从中选择一个打印机(System.Printing) var printServer = new LocalPrintServer(); PrintQueues = printServer.
970 0
|
C#
WPF Binding Mode,UpdateSourceTrigger
原文:WPF Binding Mode,UpdateSourceTrigger WPF 绑定模式(mode) 枚举值有5个1:OneWay(源变就更新目标属性)2:TwoWay(源变就更新目标并且目标变就更新源)3:OneTime(只根据源来设置目标,以后都不会变)4:OneWayToSource...
1521 0