xaml – x中ElementName的替代:与DataTemplates绑定

使用传统的{Binding}语法时,您可以指定元素名称以指向页面上的特定控件,并能够访问其属性.例如,如果页面被命名为页面,您可以执行以下操作:
{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:绑定绑定不能引用控件对象,而Customer类型执行Page.Name属性或路径.如上所示,仅使用XAML访问控件之外的用户控件属性的唯一真正方法是使用标准绑定机制.

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

相关文章

(1)when you ping a computer from itsafe,the ping command should return the local IP address. (...
1、点击win菜单,点击设置图标 2、选择系统选项 3、选择应用与程序选项 4、拉到最下方,选择程序与功能...
目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度...
windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,p...
在控制面板的程序与功能里启用和关闭windows功能打开,适用于linux的windows子系统
效果演示 推荐一个非常牛的文档网站生成器:docsify 我通过这个工具,成功将码云上的个人学习笔记发布到...