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

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

Здесь ничего нет.

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

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

же, что и

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

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

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

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

  • Binding(string path) вызывает public PropertyPath(string, Object[])
  • PropertyPathConverter вызывает internal PropertyPath(string, ITypeDescriptorContext)

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

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

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

 {Binding [(sys:Int32)0]} 

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

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

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

(Не являются ли детали реализации интересными ?)

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

 {Binding Path=Foo} 

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

 {Binding Foo} 

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

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

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

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

Обновить

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

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

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

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

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

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

  • Ошибка WPF: не удается найти управляющий элемент FrameworkElement для целевого элемента
  • Как связать перечисление с элементом управления combobox в WPF?
  • Конфликты Datacontext
  • WPF DataGrid: свойство CanContentScroll, вызывающее нечетное поведение
  • Список vs BindingList Преимущества / Недостатки
  • Связывание со статическим свойством
  • Ошибка привязки элемента ElementName
  • Связанное с WPF привязка данных свойств
  • Как форматировать столбцы DateTime в DataGridView?
  • UITableView - лучшее редактирование посредством привязки?
  • Как связать список с dataGridView?
  • Давайте будем гением компьютера.