Скомпилированные привязки x:Bind
— это директивы, которые выполняются во время разработки для генерации кода для регистрации обработчиков событий и явной установки соответствующих свойств в обход регистрации {Binding}
, которая использует отражение во время выполнения, поэтому во время выполнения нет способа обнаружить или получить дескриптор оператор привязки из x:Bind
, потому что его нет.
Как частично объяснил @Jayden, в вашем конкретном случае вообще не обязательно получать привязку, так как это не необходимо вручную / явным образом вызывать обновление привязки при изменении текста, это противоречит интуиции и приводит к неожиданным результатам.
Правильный способ гарантировать, что немедленные изменения в свойстве Text
объекта TextBox
будут зафиксированы обратно через традиционный TwoWay {Binding}
или скомпилированный TwoWay {x:Bind}
, — установить свойство UpdateSourceTrigger=PropertyChanged
.
в UWP и {Binding}
, и {X:Bind}
поддерживают UpdatteSourceTrigger, однако {X:Bind}
имеет более простую реализацию с ограниченными параметрами, однако оба делают поддерживают PropertyChanged
Оба следующих варианта будут работать:
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Margin="5" />
<TextBox Text="{x:Bind VM.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Margin="5" />
ЕДИНСТВЕННЫЙ раз, когда вы вручную обновляете привязку, это если ваш оператор привязки установил UpdateSourceTrigger
в Explicit
.
Причина, по которой вам не следует пытаться обновить привязку вручную, заключается в том, что это будет конфликтовать с оператором привязки, особенно если для привязки намеренно задано значение UpdateSourceTrigger=LostFocus
. В этом случае ваш обработчик событий по-прежнему будет обновлять привязку при изменении текста, когда или если это станет проблемой для разработчиков в будущем, они не будут думать о явной обработке события изменения текста.
В рамках перехода на скомпилированные привязки x:Bind
и с учетом того, что они могут использоваться для любых привязок, вам следует внимательно просмотреть все вызовы GetBindingExpression()
в коде и попытаться исключить их, поскольку GetBindingExpression()
больше не является надежным механизмом для определения того, был настроен DependencyProperty
, или получить оператор привязки для DependencyProperty
во время выполнения.
Мне известен один стандартный элемент управления (NumberBox
), который не поддерживает должным образом UpdateSourceTrigger=PropertyChanged
, однако из-за того, что вы не можете определить, использовалась ли скомпилированная привязка для привязки свойства, необходимого другим решениям которые будут использоваться для изменения ожидаемых нами изменений, см. этот пост для решения NumberBox
person
Chris Schaller
schedule
02.10.2020