Подтвердить что ты не робот

Почему Run.Text связывает двухстороннюю связь по умолчанию?

В .NET 4.0 Run.Text является связующим. Поэтому я попытался связать его:

<Run Text="{Binding DisplayText}"/>

Но когда я запустил, у меня получилась ошибка: "Связывание TwoWay или OneWayToSource не может работать в качестве свойства" только для чтения "DisplayText" типа "SomeNamespace.SomeClass".

Свойство DisplayText действительно было только для чтения, но так же, как и Run-Runs, в TextBlocks, который вы не можете редактировать. Так почему я должен получать эту ошибку? Я выкопал в PresentationFramework с dotPeek и достаточно уверен:

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 по умолчанию работает по умолчанию?

4b9b3361

Ответ 1

Только предположение:

Возможно, потому, что объекты Run также используются в элементе управления RichTextBox, и я могу представить, что этот элемент управления может по желанию привязать TwoWay по умолчанию!