🧩 一、代码整体结构

这段代码属于一个 WPF 窗口类(MainWindow) ,它的作用是创建一个窗口,并在窗口加载时设置一个数据绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace WpfDependencyProp
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); // 初始化界面

var student = new Student();
student.Age = 18;

var binding = new Binding();
binding.Source = student;
binding.Path = new PropertyPath("Age");
this.btnDp.SetBinding(Button.ContentProperty, binding);
}
}
}

🧠 二、通俗解释

我们来想象一个生活中的场景:

你有一个朋友叫小明(student),他的年龄是18岁。你希望在界面上有个按钮,显示他的年龄。如果小明的年龄变了,按钮上的数字也自动更新。

这个“自动更新”的功能,就是数据绑定


🔍 三、逐行解释代码

✅ 1. InitializeComponent();

1
InitializeComponent();

这是自动添加的代码,用来加载 XAML 界面文件(MainWindow.xaml)。你可以把它理解为“把窗口画出来”。


✅ 2. 创建学生对象并设置年龄

1
2
var student = new Student();
student.Age = 18;

这里创建了一个 Student 对象,并设置了它的 Age 属性为 18。

注意:Student 是你自己定义的类,假设是这样的:

1
2
3
4
public class Student
{
public int Age { get; set; }
}

✅ 3. 创建绑定对象

1
2
3
var binding = new Binding();
binding.Source = student; // 绑定源是student
binding.Path = new PropertyPath("Age"); // 绑定它的Age属性

这三行代码是在创建一个 绑定对象(Binding) ,告诉 WPF:

“我要把某个控件的属性和这个 student 对象的 Age 属性绑在一起。”

  • Source:数据从哪来?来自 student
  • Path:数据是 student 的哪个属性?是 Age

✅ 4. 把绑定设置到按钮上

1
this.btnDp.SetBinding(Button.ContentProperty, binding);

这行代码的意思是:

把按钮 btnDpContent 属性和上面定义的绑定对象连接起来。

换句话说:

按钮上显示的内容,就是 student.Age 的值。


📌 四、数据绑定的几个步骤(重点来了!)

在 WPF 中,数据绑定一般有以下几个步骤:

步骤 描述 示例
1️⃣ 定义数据源 创建一个类或对象,里面包含你想要绑定的数据 Student student = new Student()
2️⃣ 设置绑定路径 指定数据源中的哪个属性要绑定 binding.Path = new PropertyPath("Age")
3️⃣ 指定绑定目标属性 找到你要绑定的 UI 控件(如按钮、文本框)的某个属性 Button.ContentProperty
4️⃣ 建立绑定关系 使用 SetBinding 方法建立绑定 btnDp.SetBinding(Button.ContentProperty, binding)

🧱 举个生活中的比喻

你可以把数据绑定想象成:

你在厨房里烧水,温度计插在锅里,当水温变化时,温度计会自动更新。

  • student.Age 就是锅里的水温。
  • btnDp.Content 就是温度计显示的数字。
  • 绑定就像是温度计插进锅里,让温度变化自动反映出来。

✅ 补充:为什么有时候数据变了,UI 不更新?

如果你发现修改了 student.Age = 20;,但按钮内容没变,那是因为你没有实现 INotifyPropertyChanged 接口。

要让绑定自动更新,Student 类要这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Student : INotifyPropertyChanged
{
private int age;

public int Age
{
get { return age; }
set
{
age = value;
OnPropertyChanged(nameof(Age)); // 通知属性变化
}
}

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

这样,当你执行:

1
student.Age = 25;

按钮内容也会自动变成 25


🧪 你可以试试看

在 XAML 中添加一个按钮:

1
<Button x:Name="btnDp" Content="初始内容" Width="100" Height="30"/>

运行程序,你会看到按钮显示的是 18,而不是“初始内容”。

如果你在代码中再加一句:

1
student.Age = 30;

你会发现按钮内容也会变成 30(前提是实现了 INotifyPropertyChanged)。


🎯 总结

概念 说明
数据源(Source) 提供数据的对象
属性路径(Path) 数据源的哪个属性
目标属性(Target Property) 绑定到哪个控件的哪个属性
绑定方式 使用代码创建绑定对象
自动更新 要实现 INotifyPropertyChanged 接口才能自动更新