Решение 1 (не такое общее, но простое и работает):
инкапсулирует логику, которую вы уже реализовали, в пользовательский элемент управления, который имеет новое свойство зависимостей (typeof (объект)), которое представляет HoveredItemContext. В конструкторе своего пользовательского представления списка вы можете создать ContainerStyle и прикрепить события. Установите HoveredItemContext в этом EventHandlers, и вы можете привязать это свойство извне:
<ContentControl Grid.Row="0" x:Name="PreviewControl"
Content="{Binding ElementName=MyListView, Path=HoveredItemContext}"/>
<local:MyListView Grid.Row="1" x:Name="MyListView"
ItemsSource="{Binding Source={StaticResource DataSource}}" />
А вот и пользовательский элемент управления (работает):
public class MyListView : ListView
{
public static readonly DependencyProperty HoveredItemContextProperty = DependencyProperty.Register(
"HoveredItemContext",
typeof(object),
typeof(MyListView),
new PropertyMetadata(null));
public object HoveredItemContext
{
get { return GetValue(HoveredItemContextProperty); }
set { SetValue(HoveredItemContextProperty, value); }
}
public MyListView()
{
this.ItemContainerStyle = new Style()
{
TargetType = typeof(ListViewItem),
};
this.ItemContainerStyle.Setters.Add(new EventSetter(ListViewItem.MouseEnterEvent,
(MouseEventHandler)((s, e) =>
{
this.HoveredItemContext = (s as ListViewItem).DataContext;
})));
this.ItemContainerStyle.Setters.Add(new EventSetter(ListViewItem.MouseLeaveEvent,
(MouseEventHandler)((s, e) =>
{
this.HoveredItemContext = null;
})));
}
}
Решение 2 (более общее):
Я все еще работаю над ней над аналогичной проблемой, но она еще не закончена;) Если я ее закончу, я опубликую это здесь.