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

WPF/UWP 绑定中的 UpdateSourceTrigger

在开发 markdown-mail 时遇到了一些诡异的情况。代码是这么写的:

<TextBox Text="{Binding Text, Mode=TwoWay}"/>

然而在 TextChanged 事件之后延时执行了一些操作时,从 ViewModel 里拿到的值却始终是旧的。

阅读本文将了解其原因和解决办法。


无论是 WPF 还是 UWP,Binding 中都有 UpdateSourceTrigger 属性。

在 WPF 中,其可取的值为:

public enum UpdateSourceTrigger
{
    Default,
    PropertyChanged,
    LostFocus,
    Explicit
}

在 UWP 中,其可取的值为:

public enum UpdateSourceTrigger
{
    Default,
    PropertyChanged,
    Explicit
}

这些值代表的含义是:

  • Default
    • 默认值,多数情况下与 PropertyChanged 一样,然而TextBox.Text 属性来说,却是 LostFocus(WPF)或 Explicit(UWP)
  • Explicit
    • 必须在显式地调用 BindingExpression.UpdateSource 的情况下才会更新源值。
  • LostFocus(WPF 专属,不过 UWP 的预览版里也有)
    • 目标控件失去焦点的时候更新源值。
  • PropertyChanged
    • 绑定的目标值改变的时候就会更新源值,至于检测方法,则完全由 WPF/UWP 的绑定系统完成

于是,为了解决一开始的问题,我们需要在 TextBox 的 Text 属性的双向绑定里重新设置新的 UpdateSourceTrigger 的值。

<TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

没错,就是加这半句就好了。

参考资料

  • How to: Control When the TextBox Text Updates the Source - Microsoft Docs
  • c# - WPF two-way binding not working - Stack Overflow
  • The UpdateSourceTrigger property - The complete WPF tutorial
  • UpdateSourceTrigger Enum (Windows.UI.Xaml.Data) - UWP app developer - Microsoft Docs
  • UpdateSourceTrigger Enum (System.Windows.Data) - Microsoft Docs
  • TextBox.Text Property (System.Windows.Controls) - Microsoft Docs

相关文章:

  • 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)
  • 深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)
  • DependencyProperty.UnsetValue 的正确打开方式
  • 如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案
  • 出让执行权:Task.Yield, Dispathcer.Yield
  • 如何防止后台线程抛出的异常让程序崩溃退出
  • CaptureMouse/CaptureStylus 可能会失败
  • 使用 ExceptionDispatchInfo 捕捉并重新抛出异常
  • 使用 Task.Wait()?立刻死锁(deadlock)
  • 如何实现一个可以用 await 异步等待的 Awaiter
  • WPF 同一窗口内的多线程 UI(VisualTarget)
  • WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制
  • 从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配
  • 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用
  • WPF 跨应用程序域的 UI(Cross AppDomain UI)
  • 分享的文章《人生如棋》
  • $translatePartialLoader加载失败及解决方式
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • canvas 五子棋游戏
  • Fastjson的基本使用方法大全
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • mongo索引构建
  • PHP 的 SAPI 是个什么东西
  • Terraform入门 - 3. 变更基础设施
  • ViewService——一种保证客户端与服务端同步的方法
  • vue-router的history模式发布配置
  • vue的全局变量和全局拦截请求器
  • 程序员该如何有效的找工作?
  • 机器学习中为什么要做归一化normalization
  • 区块链分支循环
  • 如何在GitHub上创建个人博客
  • 提醒我喝水chrome插件开发指南
  • 一道面试题引发的“血案”
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Spring第一个helloWorld
  • 容器镜像
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)STM32单片机上位机
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (二)丶RabbitMQ的六大核心
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转)scrum常见工具列表
  • .Family_物联网
  • .NET Core引入性能分析引导优化
  • .Net Remoting常用部署结构
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET基础篇——反射的奥妙
  • @property python知乎_Python3基础之:property
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • []FET-430SIM508 研究日志 11.3.31
  • [Android View] 可绘制形状 (Shape Xml)
  • [AutoSar]BSW_OS 02 Autosar OS_STACK