难以理解和使用xaml标记扩展

时间:2011-10-13 22:05:41

标签: wpf xaml binding markup-extensions

我正在学习WPF的概念,例如数据绑定,命令,资源,元素绑定,样式等,它们广泛使用标记扩展,我在理解Markup类背后的含义时遇到了问题,因为它们正在存在超出我所理解的应用它们。所以这里有几点我需要澄清: (所有代码片段均来自C#2010书中的Pro WPF)

  1. 静态扩展的含义和用法是什么?它可以用来 声明静态资源,可以在中声明 ,但是这个xaml让我很困惑:

    <Button ... Foreground="{x:Static SystemColors.ActiveCaptionBrush}" >
    

    {x:Static SystemColors.ActiveCaptionBrush} 中,角色是什么 静态在这里,如果我使用x会发生什么变化:动态在这里?该 本书说这个xaml相当于这个代码隐藏:

      

    cmdAnswer.Foreground = SystemColors.ActiveCaptionBrush;

    这意味着如果我有一个具有静态属性的类,我应该 能够使用这样的东西:

    <Button ... Foreground="{x:Static MyClass.SomeStaticProperty}" >
    

    但它没有用,尽管我已经创建了一个类,我尝试使用 local:Static(指本地命名空间)但VisualStudio 不允许我使用它。实现的正确方法是什么? 此

  2. Binding的含义是什么(超出明显意义,是什么 发生在我有约束力的时候)?它用于资源绑定,或 数据或元素绑定。我能够理解元素绑定, 但绑定到非元素的对象会导致问题。对于 例如:

    <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},
    Path=Source}"></TextBlock>
    

    这里它绑定到SystemFonts.IconFontFamily的文本 属性,在这种情况下x:static的用途是什么,以及如何绑定 它是我创建的类中的属性?还有如何更新 如果绑定的值,则textfield的text属性 目标变化?由于绑定,它应该自行更新,是这样 案件?

    本书中的所有示例都使用了SystemFonts.IconFontFamily, 没有,我见过解释这种绑定的使用,以及如何 为我创建的课程做这些吗?在这方面有一些帮助 需要。我想问更多关于绑定的问题,但我会这样做 关于绑定的单独问题。

  3. 最后,推荐一本解释内容的书籍或资源 发生了,而不是如何做到这一点?

1 个答案:

答案 0 :(得分:3)

...答案

1)

你说......


  

...这意味着如果我有一个具有静态属性的类,我应该是   能够使用这样的东西:

   <Button ... Foreground="{x:Static MyClass.SomeStaticProperty}" >
     

但它没有用,尽管我已经创建了一个类,我尝试使用    local:Static (指本地命名空间)但VisualStudio   不允许我使用它。实现的正确方法是什么?   此?

     

您的试用尝试是否正确但是您将该命名空间令牌应用于哪个术语是不正确的.... local命名空间令牌适用于在其下声明的类...

   <Button ... Foreground="{x:Static local:MyClass.SomeStaticProperty}" >

如果SomeStaticProperty是有效的Brush

,应该可以正常工作

在此示例中,整个标记在内部等同于Binding为...

   Binding.Source = {x:Type local:MyClass}
   Binding.Path = SomeStaticProperty.

2)

你有一个例子......


   <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},     
                             Path=Source}">
   </TextBlock>  

因此,请使用与示例1相同的等效项并将其应用于此示例...

    <TextBlock Text="{Binding Source={x:Type SystemFonts},     
                              Path=IconFontFamily.Source}">
    </TextBlock>  

3)

我从MSDN学到了这一切......我不认为我们可以拥有任何其他合法来源。