为啥 Run.Text 默认是双向绑定的?

Posted

技术标签:

【中文标题】为啥 Run.Text 默认是双向绑定的?【英文标题】:Why does Run.Text bind two-way by default?为什么 Run.Text 默认是双向绑定的? 【发布时间】:2011-09-05 14:18:11 【问题描述】:

在 .NET 4.0 中,Run.Text 是可绑定的。于是我尝试绑定它:

<Run Text="Binding DisplayText"/>

但是当我运行时,我收到了一个错误:“TwoWay 或 OneWayToSource 绑定无法对 'SomeNamespace.SomeClass' 类型的只读属性 'DisplayText' 起作用。”

我的 DisplayText 属性确实是只读的,但 Run -- Runs 进入 TextBlocks 也是如此,您无法对其进行编辑。那么为什么我会收到这个错误呢?我用dotPeek 研究了PresentationFramework,果然:

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text", typeof (string), typeof (Run),
    (PropertyMetadata) new FrameworkPropertyMetadata((object) string.Empty,
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
        new PropertyChangedCallback(Run.OnTextPropertyChanged),
        new CoerceValueCallback(Run.CoerceText)));

第四行,简单明了,指定 Run.Text 应该默认绑定双向,这没有任何意义,似乎是一个明显的设计错误。

当然,这很容易解决:

<Run Text="Binding DisplayText, Mode=OneWay"/>

但我为什么要解决它呢? 为什么默认 Run 是双向绑定的?

【问题讨论】:

好问题。 6 年后,新的开发人员仍然遇到同样的问题。我什至自己都忘记了,直到我在运行时点击绑定! 【参考方案1】:

这里只是猜测:

可能是因为Run控件中也用到了Run对象,我可以想象这个控件可能要默认绑定TwoWay

【讨论】:

这是不正确的。文档说 RichTextBox 中未启用绑定,因为使用编辑操作清除绑定太容易了。 msdn.microsoft.com/en-us/library/…

以上是关于为啥 Run.Text 默认是双向绑定的?的主要内容,如果未能解决你的问题,请参考以下文章

v-mode 双向数据绑定

angular 双向数据绑定number类型的变量怎么让它没有默认值

面试题 v-model的双向绑定

antd表单组件的双向绑定

Vue3的双向绑定是如何实现的

Angular 手动实现ngModal数据双向绑定