TwoWay 绑定不是真的 Two Way 吗?

Posted

技术标签:

【中文标题】TwoWay 绑定不是真的 Two Way 吗?【英文标题】:TwoWay binding is not really Two Way? 【发布时间】:2012-05-16 08:38:37 【问题描述】:

我有两种方式将字符串依赖属性绑定到 TextBox 的文本。

绑定如下所示:

Text="Binding MyValue, Mode=TwoWay"

我有一些代码在设置MyValue 的 OnKeyUp(在附加属性中)中触发。但与其将我的值应用到 Text 属性上,不如反其道而行之。

以下是事件的顺序:

    用户输入如下文本字符串:0299900650 用户按下回车键。 在我的 on key up 中,我将 MyValue 设置为 2999 并将焦点移至下一个字段。 MyValue 的 setter 触发并使用 2999 执行 NotifiyPropertyChanged Lo​​stFocus 着火了。 MyValue 的设置器触发并使用 0299900650 执行 NotifiyPropertyChanged。

在我看来,我的价值并没有以某种方式回到“TextBox.Text”。当我失去焦点时,TextBox 正在使用它在 Text 属性中的值更新字符串的值(未更改的值,因为我的更改没有取回。)

这里有一些我不知道的 WPF 魔法吗?

注意:我已经仔细检查了我的绑定。 (除了他们从 UI 工作,所以我想他们去 UI 是正确的。)

注意二:当我说“用户输入一个字符串”时,它实际上是一个扫描的条形码。但由于我使用的是键盘楔形,就好像它是输入的一样。(但是,设置值的全部意义在于,如果用户扫描与打字相反,我会做一些不同的事情。)

更新:我发现这是由于另一个属性有副作用。我能够解决这个问题。

【问题讨论】:

【参考方案1】:

您只需跳入WPF 绑定消息的并发冲突。 为了证明这一点,请执行以下操作:

删除你的OnKeyUp偶数处理程序

然后做同样的事情。在Enter 上,单击绑定机制会触发并将您的代码设置在属性后面。

如果您在 KeyUp 上创建,您的新值 2999 会被之后的绑定抑制。

要正确管理此问题,请使用 Converter 并摆脱 OnKeyDown 甚至订阅。

【讨论】:

有没有办法在不抑制 OnKeyDown 的情况下做到这一点?我还有其他对该事件感兴趣的属性。 @Vaccano:我不知道。实际上有PreviewKeyDown 事件,但是它运行before 绑定,所以顺便说一下,绑定会抑制它,因为它也在LostFocus 上运行。 Imo,最好的解决方案是使用转换器并在您的代码隐藏中管理您的状态变量。【参考方案2】:

我发现这是由于另一个属性有副作用。我能够通过修复那个副作用来解决这个问题。

【讨论】:

以上是关于TwoWay 绑定不是真的 Two Way 吗?的主要内容,如果未能解决你的问题,请参考以下文章

[WPF源码分析]ContentControl依赖项属性的双向绑定,two-way binding view's DependencyProperty and ViewModel's

Blend 硬货 绑定

ListBox TwoWay 绑定到 SelectedItem

嵌套在惰性一次性 ng-repeat 绑定中的绑定是不是只绑定一次?

InvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

InvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作