x中ElementName的替代:与DataTemplates绑定

时间:2015-09-29 17:07:12

标签: xaml binding windows-store-apps winrt-xaml xbind

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

{Binding ElementName=Page, Path=Name}

使用{x:Bind}语法表示

  

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

因此,{x:Bind}中的上述例子将是

{x:Bind page.Name}

哪个工作正常,直到它在数据模板中(例如ListView&#39的ItemTemplate)。在这种情况下它不再起作用,因为它在指定的数据类型上查找Page导致以下错误(假设我的数据类型为customer):

  

XamlCompiler错误WMC1110:无效的绑定路径' Page.Name' :   财产' Page'无法在'客户'

上找到

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

示例代码可用here(注意特定提交)

1 个答案:

答案 0 :(得分: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>

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

我希望这能回答你的问题。