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

Разница между {Binding PropertyName} и {Binding Path = PropertyName}

Я видел оба стиля, используемые в одном проекте, и мне интересно, существует ли какая-либо семантическая разница между ними или если кто-то будет рекомендован другим и почему.

4b9b3361

Ответ 1

Нет.

Если значение не указано, ему присваивается значение свойства Path. Другими словами, Path является свойством по умолчанию привязки.

Это похоже на свойство Content, которое является свойством по умолчанию для многих элементов управления. Например

<Button>Hello</Button> То же, что и <Button><Button.Content><TextBlock Text="Hello"/></Button>

Надеюсь, что это поможет.

Ответ 2

Здесь есть существенная разница, с которой вы столкнетесь, как только у вас будет сложный путь свойства с типизированными параметрами.

В общем случае они эквивалентны, поскольку оба они устанавливают Binding.Path, один через параметризованный конструктор Binding, другой - напрямую через свойство. То, что происходит внутри, очень отличается, поскольку Binding.Path - это не просто строка, которая в обоих случаях будет передана свойству, это PropertyPath.

При анализе XAML преобразователи типов используются для преобразования строк в типы, ожидаемые свойствами. Поэтому, когда вы используете Path=, будет создан экземпляр PropertyPathConverter для разбора строки и возврата PropertyPath. Теперь вот разница:

(В случае конструктора Binding Object[] будет пустым)

Как это важно?

Если вы, например, несколько индексов в классе, например. тот, который ожидает string и тот, который ожидает int, и вы пытаетесь передать значение для таргетинга последнего, действие каста не будет работать:

{Binding [(sys:Int32)0]}

В PropertyPath отсутствует ITypeDescriptorContext, потому что публичный конструктор вызывается, поэтому тип System.Int32 не может быть разрешен из строки sys:Int32.

Если вы используете Path=, то вместо этого будет использоваться конвертер типов, и тип будет разрешен с использованием контекста, поэтому это будет работать:

{Binding Path=[(sys:Int32)0]}

(Не соответствуют ли подробности реализации?)

Ответ 3

Они означают одно и то же. Где они отличаются друг от друга тем, как объект Binding создается и заполняется.

{Binding Path=Foo}

создает экземпляр Binding, используя его конструктор без параметров, а затем устанавливает свойство экземпляра Path.

{Binding Foo}

создает экземпляр Binding с использованием его однопараметрического конструктора и передает значение "Foo" этому параметру конструктора. Однопараметрический конструктор просто устанавливает свойство Path, поэтому два синтаксиса эквивалентны.

Это очень похоже на синтаксис для настраиваемых атрибутов, где вы также можете передавать параметры конструктора и/или задавать значения свойств.

Ответ 4

Нет семантической разницы, первое свойство в привязке будет интерпретироваться как свойство "Путь", если не указано имя свойства.

Это вопрос стиля кодирования.

Обновление

Убрано предложение "Это свойство по умолчанию".

Я понимаю, что формальной поддержки "свойств по умолчанию" нет, но сценарий часто называют "свойством по умолчанию" и поддерживается соглашением.

Пример из документации MSDN для свойства Path расширения разметки Binding:

Расширение разметки Binding использует Binding.Path как концептуальное "свойство по умолчанию, где Path = не должно появляться в выражении.

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

Ответ 5

Не думайте, что есть какая-то разница, ожидайте, что вторая будет более явной.