Это тривиальный пример, иллюстрирующий проблему. Я хочу, чтобы цвет фона зависел от ввода.
<Entry
BackgroundColor = "{Binding Source = {RelativeSource Self}, Path=Text}" />
// or
<Entry
BindingContext = "{Binding Source = {RelativeSource Self}}"
BackgroundColor = "{Binding Text}" />
Оба работают со следующим выводом.
Однако если я упрощу это следующим образом, это больше не будет работать.
<Entry
BindingContext = "{RelativeSource Self}"
BackgroundColor = "{Binding Text}" />
Для сравнения мы можем упростить
ItemsSource = "{Binding Source = {StaticResource people}}"
к
ItemsSource = "{StaticResource people}"
В чем виноват?
Расширение разметки RelativeSource
предоставляет экземпляр RelativeBindingSource
, который не является реальным объектом, из которого можно получить информацию (однако его можно использовать в качестве источника для расширения Binding
).
В первых двух примерах контекст привязки для Entry
привязан к реальному объекту, возвращаемому {Binding}
.
Сравните это с ItemsSource
, которому нужен источник, а не реальный объект.
Я все еще не понимаю. Еще одно сравнение: Text = "{Binding Source = {StaticResource fullname}}"
можно упростить до Text = "{StaticResource fullname}"
.
Если вы посмотрите на исходный код RelativeSourceExtension
здесь, вы увидите, что он возвращает экземпляр RelativeBindingSource
, который не является реальным объектом.
И если вы посмотрите на код StaticResourceExtension
здесь, вы увидите, что он возвращает реальный ресурс.
Кроме того, отказ от использования источника означает, что вы можете использовать x:DataType и оптимизацию скомпилированной привязки.