【问题标题】:Getting the item under mouse cursor in ListView在 ListView 中获取鼠标光标下的项目
【发布时间】:2015-01-09 10:13:29
【问题描述】:

这可能看起来像 thisthis 问题的重复项。但我的问题是如何处理获得的ListViewItem

我已经像这样设置ListView 绑定

<ListView ItemsSource="{Binding Data}" ...>

在哪里

public ObservableCollection<Item> Data { ... }

我如何获得Item(来自ListViewItem)?


我尝试使用 mvvm 并绑定当前鼠标悬停的项目,类似于 this。但后来我绊倒了更多:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <!-- this will not work -->
                    <Setter Property="{Binding MouseoveredItem, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" Value="{Binding RelativeSource={RelativeSource Self}}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

我的意图清楚吗? Item如何让鼠标大吼大叫?


我不敢相信没有人这样做过。这是代码隐藏尝试(说明我的问题):

private void ListView_MouseMove(object sender, MouseEventArgs e)
{
    var item = VisualTreeHelper.HitTest(listView, Mouse.GetPosition(listView)).VisualHit;
    // find ListViewItem (or null)
    while (item != null && !(item is ListViewItem))
        item = VisualTreeHelper.GetParent(item);
    if (item != null)
    {
        ... // item is ListViewItem, how to convert ListViewItem it to Item
    }
}

我可以找到ListViewItem,但我需要鼠标悬停的Item 的属性,显示为SubItems 或隐藏。如何将ListViewItemItem 的可视化视图)转换为Item(这是ListViewItem 代表的)?

【问题讨论】:

  • 您在ListView_MouseMove 事件处理程序中尝试过e.OriginalSource 吗??
  • @AmolBavannavar,做什么?它有Microsoft.Windows.Themes.ListBoxChrome 类型,我应该如何使用它来获取Item
  • e.OriginalSource,你可以在VisualTreeHelper的帮助下向上遍历,你会到达那个项目。
  • @AmolBavannavar,怎么样?我会收到Item 吗?我已经用VisualTreeHelper 进行了transversing(参见最后的编辑),但是如您所见,我得到了ListViewItem(并且不是 Item)。

标签: c# wpf listview


【解决方案1】:

当您获得“ListViewItem”时,它的“DataContext”属性将返回您的“Item”。

【讨论】:

    【解决方案2】:

    在以下代码 sn-p 中,ListView 对象与ObservableCollection&lt;IDataItem&gt; 集合绑定,其中IDataItem 是自定义接口并继承INotifyPropertyChanged

    在 .xaml 中:

    MouseMove="listView_OnMouseMove"
    

    在 .xaml.cs 中:

    private void listView_OnMouseMove(object sender, MouseEventArgs e)
    {        
        if (!(e.Source is UIElement selectedObject))
            return;
    
        var mousePosition = e.GetPosition(selectedObject);
        var dataContextObject = listView.GetObjectAtPoint<ListViewItem>(mousePosition);
    
        if (!(dataContextObject is IDataItem dataItem))
            return;
    
        // Deal with the selectedObject under the mouse cursor here
    }
    
    
    // How to get Item under cursor in WPF ListView
    // https://www.py4u.net/discuss/1453642 - Answer #2
    public static object GetObjectAtPoint<ItemContainer>(this ItemsControl control, Point p) 
        where ItemContainer : DependencyObject
    {
        // ItemContainer - can be ListViewItem, or TreeViewItem and so on(depends on control)
        var obj = control.GetContainerAtPoint<ItemContainer>(p);
        if (obj == null)
            return null;
    
        return control.ItemContainerGenerator.ItemFromContainer(obj);
    }
    
    private static ItemContainer GetContainerAtPoint<ItemContainer>(this ItemsControl control, Point p) 
        where ItemContainer : DependencyObject
    {
        var result = VisualTreeHelper.HitTest(control, p);
        var obj = result.VisualHit;
    
        while (VisualTreeHelper.GetParent(obj) != null && !(obj is ItemContainer))
        {
            obj = VisualTreeHelper.GetParent(obj);
        }
    
        // Will return null if not found
        return obj as ItemContainer;
    }
    

    【讨论】:

      【解决方案3】:

      在您的 ViewModel 中使用它:

      public ObservableCollection<Item> Data { ... }
      
      public Item SelectedData { get; set; }
      

      在你的视野中

      <ListView ItemsSource="{Binding Data}" SelectedItem="{Binding SelectedData}" ...>
      

      When the selection changes, as will the SelectedData property.

      【讨论】:

      • 将鼠标移到ListView 上不会改变选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多