Decade
Decade
Published on 2025-10-21 / 11 Visits
0
0

WPF绑定自用

1. 数据结构类

csharp

public class User : INotifyPropertyChanged

这确实是一个数据结构类(数据模型/ViewModel),负责存储数据

2. 属性变更触发机制

csharp

set
{
    _name = value;
    OnPropertyChanged(nameof(Name)); // 属性改变时触发通知
}

3. 预定义的事件委托

csharp

public event PropertyChangedEventHandler PropertyChanged;

这是.NET框架内置的事件类型,专门用于属性变更通知

4. 事件触发和参数传递

csharp

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  • this:哪个对象发生了改变

  • PropertyChangedEventArgs(propertyName):哪个属性发生了改变

5. WPF的绑定查找机制

WPF运行时维护着一个"绑定注册表",当事件触发时:

  • 查找所有绑定了这个属性和对象的UI元素

  • 自动更新这些UI元素的显示

完整的数据流:

csharp

// 1. 数据改变
user.Name = "张三";

// 2. 触发通知
OnPropertyChanged("Name");

// 3. 触发事件
PropertyChanged?(user, new PropertyChangedEventArgs("Name"));

// 4. WPF查找绑定
//    ↓ WPF内部查找所有 Binding.Path="Name" 且 DataContext=user 的控件
//    ↓ 找到:<TextBlock Text="{Binding Name}"/>
//    ↓ 找到:<TextBox Text="{Binding Name}"/>

// 5. 更新UI
//    TextBlock显示"张三"
//    TextBox显示"张三"

实际应用场景:

xml

<!-- XAML中的绑定 -->
<StackPanel DataContext="{Binding CurrentUser}">
    <TextBlock Text="{Binding Name}"/>     <!-- 显示UserName -->
    <TextBox Text="{Binding Name}"/>       <!-- 编辑UserName -->
    <TextBlock Text="{Binding Email}"/>    <!-- 显示Email -->
</StackPanel>

当执行 user.Name = "新值" 时:

  • TextBlock和TextBox都会自动更新显示"新值"

  • 不需要手动操作任何UI控件!

您的理解完全正确,这正是WPF数据绑定的核心机制!


Comment