当我们在嵌套的XAML中编写时,为什么绑定语法不同

Sim*_*ons 2 wpf xaml binding mvvm

当我们在嵌套的XAML中编写时,为什么绑定语法不同.例如 :

 <extensibility:CommandBehavior 
       Command="{Binding SelectionChanged}"  
       CommandParameter="{Binding ElementName=modeItemsListBox,Path=SelectedItems}" >
Run Code Online (Sandbox Code Playgroud)

在上面的例子中我有 CommandParameterElementNamePath没有任何报价.

但同样可以写成:

<extensibility:CommandBehavior
      Command="{Binding SelectionChanged}">
      <extensibility:CommandBehavior.CommandParameter>
            <Binding ElementName="modeItemsListBox"="SelectedItems" />
      </extensibility:CommandBehavior.CommandParameter>
</extensibility:CommandBehavior>
Run Code Online (Sandbox Code Playgroud)

哪里ElementName和哪Path两个都在引号内.这只是一个不一致或我错过了一些层次结构?

Cos*_*und 5

您显示的两个代码段都将Binding类实例化为a MarkupExtension并允许它为CommandParameter您的属性提供值CommandBehaviour.

第二个变体(你称之为"嵌套的XAML")可以被称为实例化Binding类和提供属性值的规范方法:类名是元素名,每个属性都是一个属性,它遵循XML的所有约定:必须引用所有属性值.

当然,如果需要使用标记扩展来设置许多属性,这种规范语法有点沉重,因此引入了另一种简短的语法:如果需要设置CommandParameter使用标记扩展名命名的属性的值Binding,可以使用简单的CommandParameter="{Binding ...}"XML语法来做到这一点.值中的花括号非常重要,它们告诉XAML解析器以不同方式处理该属性值.你需要为新实例绑定类设置属性值,而不能使用通常的XAML语法,name="value"因为你写这里面的属性值,所以报价被跳过.

希望这能解释一切.