Хорошо, вот что я сделал ... Может быть, есть лучшее решение? Но этот, кажется, соответствует тому, что мне нужно.
Я изменил свой ListBox.ItemTemplate
, чтобы добавить 2 события: MouseEnter
и MouseLeave
в сетку:
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1" Margin="5">
<Grid MouseEnter="Grid_MouseEnter" MouseLeave="Grid_MouseLeave">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Border Background="Gray" Padding="10,5,0,5" Grid.Row="0" >
<TextBlock Text="{Binding Name, Mode=TwoWay}" HorizontalAlignment="Stretch" />
</Border>
<ListBox ItemsSource="{Binding MatchingProcessors, Mode=TwoWay}" DisplayMemberPath="SerialNumber" Grid.Row="1" MinHeight="100" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
Затем в коде я реализовал эти события и сохранил ссылку на элемент hovered в ListBox.
private ListBoxItem currentListBoxItem = null;
private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
List<UIElement> list = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), LayoutRoot as UIElement) as List<UIElement>;
var tmp = list.OfType<ListBoxItem>().Where(el => el.DataContext != null && el.DataContext is MyType).FirstOrDefault();
if (tmp != null)
{
this.currentListBoxItem = tmp;
}
}
private void Grid_MouseLeave(object sender, MouseEventArgs e)
{
this.currentListBoxItem = null;
}