当 DataContext 更改时,WPF 绑定 OneWayToSource 将源属性设置为“”

2023-11-30

当我设置目标控件的 DataContext 时,我有一个 OneWayToSource 绑定,其行为不符合我的预期。源的属性被设置为默认值,而不是目标控件的属性值。

我在标准 WPF 窗口中创建了一个非常简单的程序来说明我的问题:

XAML

<StackPanel>
  <TextBox x:Name="tb"
    Text="{Binding Path=Text,Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"
    TextChanged="TextBox_TextChanged"/>

  <Button Content="Set DataContext" Click="Button1_Click"/>
</StackPanel>

主窗口.cs

public partial class MainWindow : Window
{
   private ViewModel _vm = new ViewModel();

   private void Button1_Click(object sender, RoutedEventArgs e)
   {
      Debug.Print("'Set DataContext' button clicked");
      tb.DataContext = _vm;
   }

   private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
   {
      Debug.Print("TextBox changed to " + tb.Text);
   }
}

ViewModel.cs

public class ViewModel
{
   private string _Text;
   public string Text
   {
      get { return _Text; }
      set
      {
         Debug.Print(
            "ViewModel.Text (old value=" + (_Text ?? "<null>") + 
            ", new value=" + (value ?? "<null>") + ")");
         _Text = value;
      }
   }
}

文本框tb从 null DataContext 开始,因此绑定不会执行任何操作。因此,如果我在文本框中键入某些内容(例如“X”),ViewModel.Text 属性将保持为空。

如果我然后单击设置数据上下文按钮我本以为ViewModel.Text属性设置为“X”TextBox.Text财产。相反,它被设置为“”。当然,绑定是有效的,因为如果我在文本框中输入“Y”,在“X”之后,它会设置ViewModel.Text属性为“XY”。

这是输出的示例(由于计算顺序,最后两行是违反直觉的,但它们肯定都在键入“Y”后立即发生):

文本框更改为 X
单击“设置 DataContext”按钮
ViewModel.Text(旧值=,新值=)
ViewModel.Text(旧值=,新值=XY)
文本框更改为 XY

为什么是ViewModel.Text设置 DataContext 时属性被设置为“”而不是“X”?

我究竟做错了什么?我错过了什么吗?我对绑定有什么误解吗?

Edit:我预计输出是:

文本框更改为 X
单击“设置 DataContext”按钮
ViewModel.Text(旧值=,新值=X)
ViewModel.Text(旧值=X,新值=XY)
文本框更改为 XY


它是一个错误,也可能不是。微软声称这是精心设计的。您首先输入 x,然后通过单击 Button 杀死 DataContext,这就是为什么 TextBox 包含 x 并且您的 viewModel.Text 属性被重新初始化(其为空)。当数据上下文改变时,getter 仍然会被调用。最终你没有机会解决这个问题。

但是,您可以使用两种方式并顺其自然。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 DataContext 更改时,WPF 绑定 OneWayToSource 将源属性设置为“” 的相关文章

  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 为什么 32 位 .NET 进程的引用类型的最小大小为 12 字节

    我正在读专业 Net 性能 https rads stackoverflow com amzn click com 1430244585本书有关参考类型内部结构的部分 它提到 对于 32 位 net 进程 引用类型具有 4 字节的对象头和
  • 散列 hash_hmac 时,Convert.ToChar(0) 散列结果与 PHP 中的 chr(0) 不同的字符串

    我在 PHP 中有一个字符串 它被转换为字节数组并进行哈希处理 转换为字节数组的字符串如下所示 G 字符 0 便便 我需要 C 中的等效字节数组 这样我才能得到相同的哈希值 编辑 这是完整的问题 生成的哈希值不同 PHP api secre
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • SKScene 无法释放内存,导致内存增长有限

    我已经为此苦苦挣扎了好几天 由于某种原因 我的 SKScenes 没有正确释放 这导致内存增长有限 因为每次我退出并进入场景时 内存都会跳跃 这意味着游戏进行 10 轮后应用程序崩溃 据我所知 经过多次检查后 我没有任何保留周期或对场景本身
  • C#:检测哪个应用程序具有焦点

    我希望创建一个 C 应用程序 根据当前具有焦点的应用程序来更改内容 因此 如果用户使用 Firefox 我的应用程序就会知道这一点 Chrome Visual Studio TweetDeck 等也是如此 这可能吗 如果可能的话 我将如何实
  • DispatchGroup 逻辑工作流程

    我正在尝试实施DispatchGroup如下 但如果第一个调用返回true 然后第二个返回false 那么总体结果将返回false 但是 如果第一个调用返回false 然后第二个返回true 那么总体结果将返回false这不是我所期望的 我
  • MATLAB:将字符转换为自定义数字并返回的最快方法

    我正在寻找一种快速方法 将小写字母 空格和句点组成的大型字符数组转换为一组整数 反之亦然 通常我会使用 double 和 char 函数 但我想使用一组特殊的整数来表示每个字母 以便 a 与 1 匹配 b 与 2 匹配 z 与 26 匹配
  • 获取“运行 management.uninstall 时未选中的 runtime.lastError:”

    我正在编写一个 Chrome 扩展程序 我想在其中卸载另一个扩展程序 我正在关注文档 但收到此错误 Unchecked runtime lastError while running management uninstall chrome
  • 复制,但仅粘贴值? [复制]

    这个问题在这里已经有答案了 我有一个宏来根据过滤器复制数据 但是一些正在复制的单元格中已经有公式 所以我想复制它并仅粘贴为文本或值 我尝试使用以下内容 我尝试了 xlValues 和 Format text 它们都给出了错误 Run Tim
  • 将列表按元素附加到 R 中嵌套列表的元素

    我是 R 新手 仍在尝试了解 apply 系列而不是使用循环 我有两个列表 一个是嵌套的 另一个不是 两者都由字符组成 gt lst1 lt list c ABC DEF GHI c JKL MNO PQR gt lst2 lt c abc
  • PHP 7.1.x - mysqli_connect 未定义(扩展已打开)

    背景 我的 Windows 10 计算机上安装了 WAMP Server 3 0 6 我正在使用一些自定义 MySQL 表开发 WordPress 网站 所以我使用 wpdb Problem 我在 PHP 7 0 10 上运行 一切都很好
  • php 数组最后一个元素的不同 css 样式

    循环遍历数组时 如何为数组中要输出的最后一个元素创建不同的 css div 样式 for i 0 i lt count productid i if productrank i gt 0
  • 将文本日期转换为 Google 表格中的日期

    我正在尝试从文本类型的列转换日期 当我尝试直接通过 Google Sheets 格式选项进行格式化时 它只格式化几个日期 但其他日期则不然 我尝试使用 DATEVALUE 函数 但出现以下错误 DATEVALUE 参数 26 05 2022
  • 打开使用 System.IO.Compression 创建的 ZipArchive 时出现 C# .NET 缺少方法异常

    我有一个 C WinForms NET 应用程序 我试图在其中写入 zip 存档并使用 System IO Compression 从中读取 现在我创建了 ziparchive public void SaveStdV20ZipProjec
  • 需要帮助最大化多个相似对象中的 3 个因素并适当排序

    我需要用任何语言编写一个算法 根据 3 个因素对数组进行排序 我以度假村为例 比如 Hipmunk 假设我想去度假 我想要最便宜 评论最好 景点最多的地点 然而 我显然不可能找到一个在所有 3 项中排名第一的 示例 假设有 20 个重要景点
  • 用图像注释点图

    我正在使用 PyDot 在 python 中生成 Graphviz 点图 我想用从文件中读取的图像来注释我的节点和边缘 我在文档中找到了如何将图像作为节点 但没有找到如何将图像放在节点下 甚至更少的边缘下 http www graphviz
  • 使用 Flask 提供 .mp4 文件并在 Objective-C 应用程序上播放会导致管道损坏且无法播放

    我正在尝试在我的 iOS 应用程序上播放由 Flask Web 应用程序提供的视频 虽然我可以播放使用 传统 Web 服务器 如 Apache 提供的任何视频 但我无法播放 Flask 提供的视频 这是相关代码 Objective C NS
  • CountDownLatch 不释放线程

    我有一个方法 可以从 Firebase 存储加载图像 它在后台线程中调用 我需要阻止它 直到加载图像 以避免回调地狱 这是代码 Kotlin 语言 override fun fromNet Bitmap Log wtf TAG name l
  • 如何使用GoClipse调试Go程序?

    我在 OS X Mavericks 上使用 Go go1 3 darwin amd6 和 GoClipse 0 8 运行调试器时遇到问题 设置断点后 因此我搜索了 Stack Overflow 以及互联网的其余部分 发现我需要安装 gdb
  • System.Net.Http.HttpClient 不包含 DownloadData 的定义

    我想使用 web api 获取歌词 但它有一个错误 System Net Http HttpClient 不包含 DownloadData 的定义 并且没有扩展方法 DownloadData 接受类型为 System Net 的第一个参数
  • 当 iframe 内容更改时调整 iframe 高度(同一域)

    我已经研究了几天了 但我被困住了 我读了这个页面 根据内容调整 iframe 的大小 和这个页面 当 iframe 内容的高度发生变化时自动调整 iframe 高度 同一域 当包含 iframe 的 maine index html 首次加
  • Matplotlib/Pandas:使用时间序列缩放绘图的一部分

    我的任务很简单 我有一个时间序列ts 2010 年至 2014 年期间欧元瑞士法郎每日汇率 绘制 在该图中 我想通过放大来突出显示某个时间间隔 但是 缩放后的窗口仍然是空的 请参见下面的代码 此外 我在选择放大窗口的 x 范围时遇到了问题
  • 当 DataContext 更改时,WPF 绑定 OneWayToSource 将源属性设置为“”

    当我设置目标控件的 DataContext 时 我有一个 OneWayToSource 绑定 其行为不符合我的预期 源的属性被设置为默认值 而不是目标控件的属性值 我在标准 WPF 窗口中创建了一个非常简单的程序来说明我的问题 XAML