WPF RoutedEvent不一致:ListViewItem.MouseDoubleClick没有冒泡正确的e.Source

时间:2013-07-22 09:04:54

标签: wpf xaml listview binding routed-events

为StackPanel中包含的静态按钮的“Click”事件绑定RoutedEvent很容易。 RoutedEventArgs将按钮包含为事件的 e.Source

XAML:

<StackPanel Grid.Column="1" Button.Click="RoutedEventHandler">
    <Button Name="btn1" Content="btn1" />
    <Button Name="btn2" Content="btn2" />
</StackPanel>

代码背后:

private void RoutedEventHandler(object sender, RoutedEventArgs e)
{
    MessageBox.Show(((FrameworkElement)e.Source).Name);
}

但是 - 使用“ListViewItem.MouseDoubleClick”处理路由事件将导致 e.Source 中的ListView容器对象,而不是预期的ListViewItem对象。

XAML:

<ListView Name="lbAnecdotes" 
    ListViewItem.MouseDoubleClick="RoutedEventHandler">
    <ListView.ItemTemplate >
        <DataTemplate>
            <WrapPanel >
                <TextBlock Text="{Binding Path=Name}" />
            </WrapPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView >

你能解释一下这种不一致吗?

1 个答案:

答案 0 :(得分:1)

简单地说,ListViewItem.MouseDoubleClick事件不是RoutedEvent事件的ButtonBase.Click事件。它使用MouseButtonEventHandler委托和Direct路由策略,其中ButtonBase.Click事件是具有RoutedEvent策略的Bubbling。它们是不同类型的事件,实现方式不同。