【问题标题】:WPF .net 4.0: Textbox resets caret position when binding with UpdateSourceTrigger=PropertyChangedWPF .net 4.0:文本框在与 UpdateSourceTrigger=PropertyChanged 绑定时重置插入符号位置
【发布时间】:2011-10-26 11:28:33
【问题描述】:

我有以下情况:

  • 绑定到属性的TextBox:
<TextBox Text="{Binding Settings.ClientName, UpdateSourceTrigger=PropertyChanged}"/>
  • 属性 ClientName 将其值存储在底层结构中,并且不会在属性更改事件时调用 Notify。相反,底层结构在处理完值后会发送一个事件来刷新 UI。如果触发此类事件,则 ClientNameProperty 设置正确,并为此属性调用 Notify。

问题是,如果我输入任何文本,插入符号似乎会跳转到文本框中的第一个位置,实际上会反转我输入的任何字符串。 “abcd”变成“dcba”

我注意到这种行为是在我们迁移到 Net 4.0 之后发生的。

有什么好的解决方案吗? 非常感谢

【问题讨论】:

  • 你能展示一些代码你是如何刷新你的 UI 并通知属性改变的吗?

标签: wpf binding textbox


【解决方案1】:

没有内置的行为可以做到这一点。这个问题很可能来自您的处理。

附带说明,如果您希望 TextBox 从代码隐藏和用户输入更改,您希望将其设置为双向:

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

编辑:
您还可以将 ClientName 设为依赖属性(vs2010 中的 propdp sn-p)。这将自动完全支持绑定(/样式/动画),并让您可以在值更改时采取行动,并通过回调委托将其强制返回。
最后但同样重要的是,您仍然不需要 Settings 类来实现 INotifyPropertyChanged
Here 是一个起点 (msdn)。

【讨论】:

  • 感谢您的回答,我将尝试使用显式的双向绑定。但是:我在互联网上读到文本框的 binidng 行为发生了变化,我注意到自从我们升级到 4.0 后出现了不同的行为。我刚刚注意到,如果我在更新属性后立即调用 notify(不仅是在对事件做出反应时),它会按预期工作。还有其他想法吗?
  • TextBox 上的绑定在 LostFocus 上更新,常规绑定在 PropertyChanged 上默认更新。我将用另一个解决方案编辑我的答案。
  • 是的,我需要在任何文本更改后立即更新属性,因为我不能依赖 LostFocus
【解决方案2】:

我怀疑您在 WPF 文本框中遇到了这种行为变化:https://connect.microsoft.com/VisualStudio/feedback/details/588343/changed-behaviour-from-net-3-5-to-net-4-0-of-wpf-textbox-formatting-when-propertychanged-is-used-as-updatesourcetrigger(当 PropertyChanged 用作 UpdateSourceTrigger 时,WPF 文本框格式的行为从 .Net 3.5 更改为 .Net 4.0)

【讨论】:

  • 仅链接回答:现在链接已失效,回答无用。
猜你喜欢
  • 2011-01-08
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多