【问题标题】:WPF Binding when to use whichWPF Binding 何时使用 which
【发布时间】:2016-03-31 04:53:29
【问题描述】:

阅读了几篇关于 WPF 的文章,我注意到绑定通常以不同的方式使用:

  • {Binding UserName} 绑定到 UserViewModel 类的 UserName 属性。
  • {Binding Path=UserName} 同上。
  • {Binding}。注意,它是单独使用的,没有提供路径或属性名称。我见过这个,但不明白它是如何绑定到任何东西的?

例如,我在the article 中看到了这个,DataTemplate 定义了这个:

<ContentControl Margin="20,10" Content="{Binding Path=CurrentProduct}" />

,那么在MainWindow.xaml中,Binding就是这样使用的

<ContentControl Content="{Binding}" HorizontalAlignment="Center" Margin="10" />

为什么这里只使用Binding,它是什么意思?

【问题讨论】:

标签: wpf data-binding


【解决方案1】:

你问的只是 WPF 中的一个 XAML 扩展,它通常被命名为 WPF 数据绑定。

WPF 中的数据绑定相当复杂,但您应该先阅读 WPF 的 MSDN Library 文档,因为它非常详细,当然也是官方和最权威的资源。

我建议您首先访问 MSDN Library for WPF 数据绑定。你应该从这个页面开始:Data Binding (WPF)

【讨论】:

    【解决方案2】:
    1. 以下语句是等价的:

      • {Binding UserName} 绑定到 UserName 的属性 UserViewModel
      • {Binding Path=UserName}同上

      因为以下几点。

      • 这样的用法:{Binding …}Binding 标记扩展用法。请注意Binding class 的继承层次结构:这里是MarkupExtension 类。
      • 第二条语句使用隐式路径:

        隐式路径

        Binding 标记扩展使用Binding.Path 作为概念上的“默认属性”,其中Path= 不需要出现在表达式中。如果您使用隐式路径指定 Binding 表达式,则隐式路径必须首先出现在表达式中,在任何其他 bindProp=value 对之前,其中 Binding 属性由名称指定。例如:{Binding PathString},其中PathString 是一个字符串,它被评估为由标记扩展用法创建的Binding 中的Binding.Path 的值。您可以在逗号分隔符后附加带有其他命名属性的隐式路径,例如,{Binding LastName, Mode=TwoWay}

        ——Binding Markup Extension, MSDN.

      所以,使用哪一个是一个选择问题。

    2. 以下声明:

      • {Binding}

      表示与当前源的绑定:

      • (可选)句点 (.) 路径可用于绑定到当前源。例如,Text="{Binding}" 等价于 Text="{Binding Path=.}"

      只要绑定已经有一个数据上下文(例如,继承自父元素的数据上下文),并且该上下文返回的任何项目或集合都适合绑定,而无需需要进一步修改路径,绑定声明可以根本没有子句:{Binding}。这通常是为数据样式指定绑定的方式,其中绑定作用于集合。有关详细信息,请参阅Binding Sources Overview 中的“用作绑定源的整个对象”部分。

      ——Windows Presentation Foundation: Data Data Binding (WPF): Binding Declarations Overview, MSDN.

    【讨论】:

      【解决方案3】:

      Binding 类有很多属性,Path 属性就是其中之一。

      • &lt;ContentControl Content="{Binding Path=CurrentProduct}" /&gt; -- XAML 引擎将调用默认值(无参数构造函数)并将属性Path 分配给“CurrentProduct”。

      • &lt;ContentControl Content="{Binding CurrentProduct}" /&gt; -- XAML 引擎将解析 XAML,前提是存在可以获取该值的构造函数,而 Binding 类确实具有该值!

      • &lt;ContentControl Content="{Binding}" /&gt; -- XAML 引擎将调用默认值(无参数构造函数),并且由于没有为属性路径分配值,因此它将使用来自 DataContext 的值。

        李>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 2023-04-08
        • 2011-01-24
        相关资源
        最近更新 更多