XAML x中ElementName的替代方法:使用DataTemplates绑定

4c8rllxm  于 2023-06-27  发布在  其他
关注(0)|答案(2)|浏览(142)

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

{Binding ElementName=Page, Path=Name}

使用{x:Bind}语法,它表示
使用x:Bind时,不需要使用ElementName=xxx作为绑定表达式的一部分。通过x:Bind,您可以使用元素的名称作为绑定路径的第一部分,因为命名元素将成为表示根绑定源的页或用户控件中的字段。
因此,对于上面的{x:Bind}中的示例,将是

{x:Bind page.Name}

它工作正常,直到它在数据模板中(例如ListView的ItemTemplate)。在这种情况下,它不再工作,因为它正在指定的数据类型上查找Page,这导致了以下错误(假设我的数据类型是customer):
XamlCompiler错误WMC 1110:绑定路径“Page.Name”无效:在类型“Customer”上找不到属性“Page”
如何将{x:Bind}语法用于数据模板和数据模板外部的访问控制?
示例代码可用here(注意特定提交)

3wabscal

3wabscal1#

据我所知,目前还没有办法使用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>

你得到的错误的原因是由于数据模板的父数据源的方式。绑定不能引用控件对象,而您的Customer类型引用Page.Name属性或路径。如上所示,仅使用XAML访问控件外部的用户控件属性的唯一真实的方法是返回到标准绑定机制。
我希望这能回答你的问题。

eoxn13cs

eoxn13cs2#

这是一个更新的答案 *davemsdevsa的 * 之一。我不确定这是什么时候实现的,但现在你可以直接在UWP或WinUI3中的属性路径中使用元素的名称,就像这样:

<DataTemplate x:DataType="local:Customer">
     <StackPanel Orientation="Vertical">
         <!-- if page is an element with x:Name="page" -->
         <Button Content="{x:Bind page.Name}" />
         <TextBlock Text="{x:Bind Title}" />
     </StackPanel>        
 </DataTemplate>

我引用Property Path Resolution文档:
使用x:Bind时,不需要使用ElementName=xxx作为绑定表达式的一部分。相反,您可以使用元素的名称作为绑定路径的第一部分,因为命名元素将成为表示根绑定源的页或用户控件内的字段。

相关问题