当前位置: 首页 > news >正文

WPF学习PropertyChanged

让我解释一下 `PropertyChanged` 事件的订阅过程。在 WPF 中,当我们使用数据绑定时,WPF 框架会自动订阅 `PropertyChanged` 事件。让我们看看完整的流程:

1. **事件声明**:
```csharp
public event PropertyChangedEventHandler? PropertyChanged;
```

2. **事件触发**:
在您的 `MainViewModel` 中,当属性值改变时,通过 `OnPropertyChanged` 方法触发事件:
```csharp
protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
```

3. **实际订阅发生在 XAML 绑定时**:
```xml
<Window.DataContext>
    <viewmodels:MainViewModel/>
</Window.DataContext>

<TextBlock Text="{Binding Message}" 
           FontSize="24" 
           Margin="0,0,0,20"/>
```

当 XAML 中使用 `Binding` 时,WPF 框架会:
1. 创建一个 `BindingExpression` 对象
2. 这个对象会自动订阅目标对象(ViewModel)的 `PropertyChanged` 事件
3. 当事件触发时,更新 UI 元素

让我们通过一个具体例子来说明:

```csharp
public class MainViewModel : INotifyPropertyChanged
{
    private string _message = "Hello World";

    // 属性
    public string Message
    {
        get => _message;
        set
        {
            if (_message != value)
            {
                _message = value;
                // 当值改变时,触发PropertyChanged事件
                OnPropertyChanged(nameof(Message));
            }
        }
    }

    // 事件声明
    public event PropertyChangedEventHandler? PropertyChanged;

    // 触发事件的方法
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
```

当这个 ViewModel 被设置为 Window 的 DataContext 时:
```xml
<TextBlock Text="{Binding Message}"/>
```

WPF 内部会执行类似这样的操作(这是简化的示意,实际实现更复杂):
```csharp
// WPF框架内部的绑定处理(简化版)
var viewModel = (MainViewModel)DataContext;
viewModel.PropertyChanged += (sender, args) =>
{
    if (args.PropertyName == "Message")
    {
        // 更新UI元素的值
        textBlock.Text = viewModel.Message;
    }
};
```

所以,虽然在代码中我们没有看到显式的订阅,但是:
1. WPF 的绑定系统会自动处理订阅
2. 每个绑定到 ViewModel 属性的 UI 元素都会创建一个订阅
3. 当我们调用 `OnPropertyChanged` 时,所有订阅的 UI 元素都会收到通知并更新

这就是为什么我们只需要:
1. 实现 `INotifyPropertyChanged` 接口
2. 声明 `PropertyChanged` 事件
3. 在属性变化时调用 `OnPropertyChanged`

WPF 框架会处理剩下的所有事情,包括事件订阅和 UI 更新。这是 WPF 数据绑定系统的一个重要特性,它使得 MVVM 模式的实现变得更加简单和优雅。


文章转载自:

http://hl6n6MJJ.mywnk.cn
http://AMQUTNyx.mywnk.cn
http://pYztDJRp.mywnk.cn
http://kas7zQrT.mywnk.cn
http://R2tkCVu1.mywnk.cn
http://XqJQ4Z0Z.mywnk.cn
http://MWMzGoxO.mywnk.cn
http://Dq68OLn1.mywnk.cn
http://jFc6HPct.mywnk.cn
http://ef0OACqA.mywnk.cn
http://4FpJkEUy.mywnk.cn
http://KQD38s6h.mywnk.cn
http://EvIR5ADZ.mywnk.cn
http://0VldN60M.mywnk.cn
http://ObPzcNfK.mywnk.cn
http://BG4FEfaH.mywnk.cn
http://ocifGkon.mywnk.cn
http://gsGuoRct.mywnk.cn
http://EHSPlF5b.mywnk.cn
http://cHRhyy7X.mywnk.cn
http://gAfFlNZb.mywnk.cn
http://N2E7aXcP.mywnk.cn
http://sGGNVyaO.mywnk.cn
http://STvxElsJ.mywnk.cn
http://59p5sSyZ.mywnk.cn
http://kFdQK6OG.mywnk.cn
http://85Nf5ZbA.mywnk.cn
http://eUF1Ikp8.mywnk.cn
http://hHmrGOpK.mywnk.cn
http://adlioZ7X.mywnk.cn
http://www.dtcms.com/a/236546.html

相关文章:

  • 【走好求职第一步】求职OMG——见面课测验4
  • LangChain面试内容整理-知识点1:LangChain架构与核心理念
  • 蓝桥杯 国赛2024python(b组)题目(1-3)
  • [学习]扩频码测距原理、实现与精度分析(仿真代码)
  • 题目 3241: 蓝桥杯2024年第十五届省赛真题-挖矿
  • [SNOI2024] 公交线路 题解(观察,点减边容斥,优化trick)
  • 如何评估大语言模型效果
  • 大数据(1) 大数据概述
  • JUC并发编程(五)volatile/可见性/原子性/有序性->JMM
  • HBuilderX安装(uni-app和小程序开发)
  • 【大模型】大模型RAG(Retrieval-Augmented Generation)面试题合集
  • 第19节 Node.js Express 框架
  • 免费批量文件重命名工具
  • 两种Https正向代理的实现原理
  • 一.设计模式的基本概念
  • Python训练营打卡day46
  • 基于Scala实现Flink的三种基本时间窗口操作
  • 微软PowerBI考试 PL300-使用适用于 Power BI 的 Copilot 创建交互式报表
  • AI书签管理工具开发全记录(十五):TUI基本逻辑实现与数据展示
  • 理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合检索增强生成系统
  • 使用 C++/OpenCV 创建动态流星雨特效 (实时动画)
  • PyTorch 中cumprod函数计算张量沿指定维度的累积乘积详解和代码示例
  • 常用函数库之 - std::function
  • 计算机操作系统(十五)死锁的概念与死锁的处理方法
  • 轮廓上距离最大的两个点
  • 温控加热电路【比较器输出作为MOS开关】
  • Python Copilot【代码辅助工具】 简介
  • C++修炼:C++11(二)
  • 鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
  • 数 据 结 构 进 阶:哨 兵 位 的 头 结 点 如 何 简 化 链 表 操 作