代码之家  ›  专栏  ›  技术社区  ›  Sven Amann

Xaml AttachedAttribute如何用于子节点?

  •  0
  • Sven Amann  · 技术社区  · 11 年前

    我目前正在尝试了解Xaml的一些功能。Xaml如下所示:

    <ListView ItemsSource="{Binding Source={StaticResource SortedEvents}}"
              GridViewColumnHeader.Click="SortableListViewColumnHeaderClicked">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="A" DisplayMemberBinding="{Binding ...}"
                                Width="80"/>
            </GridView>
        </ListView.View>
    </ListView>
    

    我的问题是关于 attached property “GridViewColumnHeader.Click”(第二行)。不知何故,它被应用于由列隐式定义的所有GridViewColumnHeaders。我试图在后面的代码中重新实现此功能,但失败了,因为我无法访问GridViewColumnHeaders,即使在遍历VisualTree时也是如此。。。

    有人能告诉我这是如何实现的吗? 任何帮助都将不胜感激!


    简短回答:不是 attached attributes 但是 attached events 。突然间,我找到了正确的教程来了解发生了什么!

    在后面的代码中,我对

    listView.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(SortableListViewColumnHeaderClicked));
    
    1 回复  |  直到 11 年前
        1
  •  3
  •   Community Mohan Dere    5 年前

    这些不是附属的财产,但 routed events :

    函数定义:路由事件是一种事件类型,它可以在元素树中的多个侦听器上调用处理程序,而不仅仅是在引发事件的对象上。

    实现定义:路由事件是一个CLR事件,由RoutedEvent类的实例支持,并由Windows Presentation Foundation(WPF)事件系统处理。

    明确地 attached events .

    XAML语言还定义了一种特殊类型的事件,称为附加事件。附加事件使您能够将特定事件的处理程序添加到任意元素。处理事件的元素不需要定义或继承附加的事件,潜在引发事件的对象和目标处理实例都不需要将该事件定义为类成员或以其他方式“拥有”该事件。

    WPF输入系统广泛使用附加事件。然而,几乎所有这些附加事件都是通过基本元素转发的。然后,输入事件显示为基本元素类成员的等效非附加路由事件。例如,通过在任何给定的UIElement上使用MouseDown,而不是在XAML或代码中处理附加事件语法,可以更容易地在该UIElement上处理底层附加事件Mouse.MouseDown。


    在调用的代码中执行相同的逻辑 AddHandler ListView 并通过 ClickEvent 领域