使用 DataTemplates 替代 x:Bind 中的 ElementName

Alternative to ElementName in x:Bind with DataTemplates

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

{Binding ElementName=Page, Path=Name}

使用 {x:Bind} 语法表示

With x:Bind, you do not need to use ElementName=xxx as part of the binding expression. With x:Bind, you can use the name of the element as the first part of the path for the binding because named elements become fields within the page or user control that represents the root binding source.

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

{x:Bind page.Name}

在将其放入数据模板(例如 ListView 的 ItemTemplate)之前效果很好。在这种情况下,它不再工作,因为它在指定的数据类型上寻找 Page,这会导致以下错误(假设我的数据类型是 customer):

XamlCompiler error WMC1110: Invalid binding path 'Page.Name' : Property 'Page' can't be found on type 'Customer'

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

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

据我所知,目前无法使用 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:Bind 绑定不能引用控制对象,而您的 Customer 类型引用 Page.Name 属性 或路径。如上所示,仅使用 XAML 访问您控件之外的用户控件属性的唯一真正方法是求助于标准绑定机制。

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