Это тривиальный пример, иллюстрирующий проблему. Я хочу, чтобы цвет фона зависел от ввода.
<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 и оптимизацию скомпилированной привязки.