Разница между {Binding PropertyName} и {Binding Path = PropertyName} - PullRequest
19 голосов
/ 29 ноября 2010

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

Ответы [ 5 ]

45 голосов
/ 21 февраля 2012

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

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

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

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

Какое это имеет значение?

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

{Binding [(sys:Int32)0]}

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

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

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

(Детали реализации забавные )?)

23 голосов
/ 30 ноября 2010

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

{Binding Path=Foo}

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

{Binding Foo}

создаетэкземпляр Binding, использующий конструктор с одним параметром, и передает значение «Foo» этому параметру конструктора.Конструктор с одним параметром просто устанавливает свойство Path, поэтому два синтаксиса эквивалентны.

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

15 голосов
/ 29 ноября 2010

Нет ни одного.

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

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

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

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

5 голосов
/ 29 ноября 2010

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

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

Обновление

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

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

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

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

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

3 голосов
/ 29 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...