2017-08-29 72 views
0

内点击了项这是一个布局我在XAML:EventToCommand得到一个ItemsControl

<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> 

在后面的代码我有这样子它处理的ScrollViewer的的PreviewMouseLeftButtonDown事件:

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

在我的UserControl内部BabDesignerRow我有很多像TextBox,ComboBox,LayoutGroup等不同的UI对象。

现在,无论我点击什么,我总是将整个ItemsControl作为e.Source获取,而不是选定的真实对象。

有没有办法让我的UserControl内点击对象?

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

回答

1

这是因为路由事件的隧道策略。您应该详细了解路由事件及其冒泡和隧道策略。

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

尽管这似乎是通过一个元素 树跟随冒泡的路线,它实际上是提出并沿着各自的UIElement元素树重新抛出 直接路由事件。

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

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