EventToCommand用于在ItemsControl中单击项目

时间:2017-08-29 14:43:51

标签: wpf vb.net mouseevent scrollviewer itemscontrol

这是我在XAML中的布局:

<ScrollViewer Name="svDesigner" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Focusable="False">
    <ItemsControl ItemsSource="{Binding DesignerRowsCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type base:UI_DesignerRow}">
                <cntrl:BabDesignerRow Margin="2"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <dxmvvm:Interaction.Behaviors>
            <dxmvvm:EventToCommand EventName="MouseLeftButtonDown" 
                               Command="{Binding SetPropertiesSourceCommand}" PassEventArgsToCommand="True">
                <dxmvvm:EventToCommand.EventArgsConverter>
                    <conv:DesignerItemClickEventArgsConverter/>
                </dxmvvm:EventToCommand.EventArgsConverter>
            </dxmvvm:EventToCommand>
        </dxmvvm:Interaction.Behaviors>
    </ItemsControl>

在后面的代码中我有这个Sub来处理ScrollViewer的PreviewMouseLeftButtonDown事件:

Private Sub DesignerItemSelectionRedirect(sender As Object, e As MouseButtonEventArgs) Handles svDesigner.PreviewMouseLeftButtonDown

在我的UserControl BabDesignerRow中,我有很多不同的UI对象,如TextBox,ComboBox,LayoutGroup等。

现在,无论我在哪里点击,我总是将整个ItemsControl作为e.Source而不是所选的真实对象。

有没有办法在UserControl中点击对象?

我需要获取此信息以突出显示用户选择的内容。

1 个答案:

答案 0 :(得分:1)

这是因为路由事件的隧道策略。您应该阅读有关路由事件及其冒泡和隧道策略的更多信息。

您可以使用此事件的冒泡版本:e.OriginalSource。作为MSDN states

  

虽然这似乎遵循通过元素的冒泡路线   树,它实际上是一个直接路由事件,被提出并重新加注   每个UIElement沿着元素树。

所以这不是一个真正冒泡的事件,但它应该适合你的情况。

或者,您可以使用e.Source属性而不是lstOrdered来获取导致此事件的元素。