Почему скомпилированные привязки не работают со свойствами зависимостей, а классические привязки работают? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытался настроить привязку из dependency property в пользовательском элементе управления, который я написал, и заметил, что привязка не обновляется правильно. Я должен отметить, что я просто связываю с собственности.

Свойство довольно стандартное, например:

public bool HasText
{
    get => (bool)GetValue(HasTextProperty);
    private set => SetValue(HasTextProperty, value);
}

public static readonly DependencyProperty HasTextProperty = DependencyProperty.Register(
    nameof(HasText), typeof(bool), typeof(TextEditor), new PropertyMetadata(false));

Теперь я впервые попробовал скомпилированное связывание, которое не удалось (оно не показывало ошибок, но оно просто не работало):

<controls:TextEditor x:Name="SomeTextEditor"/>
<controls:SomeControl IsEnabled="{x:Bind SomeTextEditor.HasText, Mode=OneWay}"/>

Затем я попытался использовать классическую привязку, и это прекрасно работало:

<controls:TextEditor x:Name="SomeTextEditor"/>
<controls:SomeControl IsEnabled="{Binding ElementName=SomeTextEditor, Path=HasText}"/>

Теперь я должен сказать, что не уверен, почему это происходит. dependency property имеет встроенную поддержку уведомлений, иначе классическая привязка также не будет работать. И я не забыл, что x:Bind по умолчанию равен Mode=OneTime, но даже после ручной установки его на Mode=OneWay он все равно не работал.

Есть идеи? Я вполне мог бы упустить что-то очевидное здесь.

Спасибо! ?

1 Ответ

0 голосов
/ 17 апреля 2019

Во время компиляции XAML {x:Bind} преобразуется в код, который получит значение из свойства в источнике данных и установит его в свойстве указано в разметке.

Указанное x:Name становится именем поля , которое создается в базовом коде при обработке XAML, и это поле содержит ссылку на объект.

Если вы используете x:Bind для привязки поля x:Name, IsEnabled не получит доступное значение, как в следующем коде.Вот почему следующее не работает.

<controls:SomeControl IsEnabled="{x:Bind SomeTextEditor.HasText, Mode=OneWay}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...