【问题标题】:Alternative to ElementName in x:Bind with DataTemplatesx:Bind with DataTemplates 中 ElementName 的替代方案
【发布时间】:2015-12-27 06:45:14
【问题描述】:

使用传统的 {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 错误 WMC1110:绑定路径“Page.Name”无效: 在“客户”类型上找不到属性“页面”

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

示例代码可用here(注意具体提交)

【问题讨论】:

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


    【解决方案1】:

    据我所知,目前无法使用 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 访问控件之外的用户控件属性的唯一真正方法是求助于标准绑定机制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2015-03-03
      相关资源
      最近更新 更多