ListBox PreviewMouseLeftButtonDown DataTemplate的问题

时间:2010-07-13 08:45:20

标签: c# wpf

我将PreviewMouseLoeftButtonDown事件处理程序附加到ListBox。目的是从事件处理程序中的“e.Source”参数获取单击的ListBoxItem。这与以下UI代码完美配合:

</ListBox>
  <ListBox Name="listBox3">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"></StackPanel>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBoxItem>
    <Rectangle Height="25" Width="30">
  </ListBoxItem>
</ListBox>

代码:

 listBox3.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(PreviewMouseLeftButtonDown);
 private void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {}

执行时,“e.Source”将填充我单击的ListBoxItem。这就是我想要发生的事情。

但是下面的代码表现不一样。

<ListBox Name="listBox3">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"></StackPanel>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Rectangle Width="30" Height="25"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

List<int> items = new List<int> {1};
listBox3.ItemsSource = items;
listBox3.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(PreviewMouseLeftButtonDown);
private void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {}

在这种情况下,ListBox中的矩形显示OK。但是在这种情况下,“e.Source”将填充包含我单击的项目的 ListBox 。这不是我想要的,我希望e.Source包含我点击的 ListBoxItem ,就像我上面附带的第一段代码中发生的一样。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

为什么不依靠SourceOriginalSource作为ListBoxItem,为什么不通过样式在ListBoxItem上设置事件?

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
         <EventSetter Event="PreviewMouseLeftButtonDown" Handler="PreviewMouseLeftButtonDown"/>
    </Style>
</ListBox.ItemContainerStyle>

这样您就可以确保源始终是ListBoxItem。

答案 1 :(得分:0)

e.OriginalSource将给出ListboxItem