2013-03-08 6 views
2

Почему синтаксис привязки Различается, когда мы пишем во вложенном XAML. Например:Почему синтаксис привязки Различается, когда мы пишем во вложенном XAML

<extensibility:CommandBehavior Command="{Binding SelectionChanged}" 
CommandParameter="{Binding ElementName=modeItemsListBox,Path=SelectedItems}" > 

В приведенном выше примере у меня есть CommandParameterElementName и Path без каких-либо кавычки.

Но то же самое можно записать в виде:

<extensibility:CommandBehavior Command="{Binding SelectionChanged}" > 
          <extensibility:CommandBehavior.CommandParameter> 
           <Binding ElementName="modeItemsListBox" 
             Path="SelectedItems" /> 
          </extensibility:CommandBehavior.CommandParameter> 
         </extensibility:CommandBehavior> 

Где ElementName и Path оба внутри кавычек. Является ли это просто несогласованностью или мне не хватает какой-то иерархии?

ответ

5

Два фрагментов коды вы показываете как экземпляр Binding класса как MarkupExtension и позволяют ему обеспечить значение для CommandParameter собственности вашего CommandBehaviour.

Второй вариант (тот, который вы называете «вложенным XAML») можно назвать каноническим способом создания экземпляра класса Binding и предоставления значений свойств: Имя класса - это имя элемента, каждое свойство является атрибутом, и это следует все соглашения XML: все значения атрибутов должны быть указаны.

Этот канонический синтаксис, конечно, тяжелый, если вам нужно установить множество свойств с помощью расширений разметки, поэтому был предложен альтернативный синтаксис коротких рук: если вам нужно установить значение свойства с именем CommandParameter, используя расширение разметки Binding, вы можете сделать это, используя простой синтаксис XML CommandParameter="{Binding}". Кудрявые фигурные скобки в значении очень важны, они говорят, что анализатор XAML обрабатывает это значение атрибута по-разному. Вам нужно будет установить значения свойств для вновь созданного класса Binding, и вы не можете использовать обычный синтаксис XAML name="value", потому что вы пишете это значение внутри значения, поэтому котировки пропускаются.

Надеюсь, это все объясняет.

Смежные вопросы