x中ElementName的替代:与DataTemplates绑定

Rob*_*ean 9 xaml binding winrt-xaml windows-store-apps xbind

使用传统的{Binding}语法时,您可以指定元素名称以指向页面上的特定控件,并能够访问其属性.例如,如果页面已命名page您可以执行以下操作:

{Binding ElementName=Page, Path=Name}
Run Code Online (Sandbox Code Playgroud)

{x:Bind}语法表示

使用x:Bind,您不需要使用ElementName = xxx作为绑定表达式的一部分.使用x:Bind,您可以使用元素的名称作为绑定路径的第一部分,因为命名元素成为页面或用户控件中表示根绑定源的字段.

因此,对于{x:Bind}中的上述示例,将是

{x:Bind page.Name}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,直到它在数据模板内(例如ListView的ItemTemplate).在这种情况下,它不再工作,因为它正在寻找Page指定的数据类型,这导致以下错误(假设我的数据类型是customer):

XamlCompiler错误WMC1110:无效的绑定路径'Page.Name':在'Customer'类型上找不到属性'Page'

将{x:Bind}语法与数据模板和数据模板外部的访问控制一起使用的解决方案是什么?

此处提供示例代码(请注意具体提交)

小智 11

据我所知,此时无法使用x:bind方法直接绑定到控件的属性,因为它不支持其绑定定义中的元素名称.

这并不意味着你无法绑定到dataTemplate中的控件,你仍然可以做这样的事情来访问控件,但你只是无法使用编译的绑定x:Bind语法.

 <DataTemplate x:DataType="local:Customer">
     <StackPanel Orientation="Vertical">
         <Button Content="{Binding Name, ElementName=page}" />
         <TextBlock Text="{x:Bind Title}" />
     </StackPanel>        
 </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

您获得错误的原因是数据模板为其数据源提供父级的方式.x:绑定绑定不能引用控件对象,而Customer类型执行Page.Name属性或路径.如上所示,仅使用XAML访问控件之外的用户控件属性的唯一真正方法是返回标准绑定机制.

我希望这回答了你的问题.