为啥 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 默认是双向绑定的?的主要内容,如果未能解决你的问题,请参考以下文章