2012-10-19 51 views
2

問題:找出鼠標是哪個項目在列表視圖,而使用的ItemsSource

當您需要用項目的列表查看源代碼的項目不再ListViewItem他們成爲類/結構或任何你使用作爲.ItemsSource這意味着我不能在我的PreviewMouseMove上使用'.IsMouseOver'屬性事件

我該怎麼辦?

  1. 鑄造ListViewItemListViewItem,然後調用.IsMouseOver就可以了(當你把鼠標移動到列表視圖不強調什麼,但在運行時崩潰,並說「不能投類名ListViewItem
  2. 我試圖讓我的類繼承自IInputElement public ClassName : IInputElement不知道如果可能或不行不說它不能找到它我有點新來c#所以我不知道該如何工作,我假設它必須是一個可見的元素給你.IsMouseOver它。
  3. 我試圖讓我的課程從ListViewItem繼承,如public ClassName : ListViewItem這工作!但ListViewItem不包含.IsMouseOver屬性,並且它仍然不會讓我將類轉換爲ListViewItem而不會崩潰<。 <

總的目標是要突出一個列表項和填充一束與該鼠標在類中的值文本字段,我已經在之前的WinForms做到了這一點,但它是在WinForms的

超輕鬆

回答

3

您仍然應該將您的控件綁定到邏輯對象。雖然SelectedItem屬性不是ListViewItem,但可視化樹仍將包含一個。使用VisualTreeHelper和HitTest作爲鼠標移動的項目。一旦你有這個項目,檢查DataContext屬性的綁定項目。

下面是一些代碼:

private ListViewItem FindListViewItem(DragEventArgs e) 
{ 
    var visualHitTest = VisualTreeHelper.HitTest(_listView, e.GetPosition(_listView)).VisualHit; 

    ListViewItem listViewItem = null; 

    while (visualHitTest != null) 
    { 
     if (visualHitTest is ListViewItem) 
     { 
      listViewItem = visualHitTest as ListViewItem; 

      break; 
     } 
     else if (visualHitTest == _listView) 
     { 
      Console.WriteLine("Found ListView instance"); 
      return null; 
     } 

     visualHitTest = VisualTreeHelper.GetParent(visualHitTest); 
    } 

    return listViewItem; 
} 

另一種選擇是風格你ItemsContainerStyle處理鼠標懸停你想要的方式。

+0

只是努力實現這一點,如果我得到它的工作,我會選擇它 –

+0

好吧,這種作品,但我得到列表視圖項後,我怎麼能把它投給我的課?原因(classname)listviewitem說我不能將listview項目轉換爲classname ..... –

+0

@JustinKirk一旦你有了這個項目,檢查DataContext屬性的綁定項目。 –

1

實際上,即使你綁定了你的ListView ItemsSource,你的視覺樹中仍然會有ListViewItems。這就是WPF調用項目容器(例如ListBoxItem)。

您的ListView上有一個名爲ItemContainerGenerator的屬性。這將返回一個ItemContainerGenerator對象,該對象具有一個名爲ContainerFromItem的方法,該方法將返回與您對象關聯的ListViewItem。

然後,您可以使用IsMouseOver對您檢索的容器感謝項目容器生成器。

+0

感謝您的建議,上面的人給出了相同的建議+代碼,所以我選擇了他的答案,而不是> D –

+0

嘿,只要你解決了你的問題,我爲你感到高興!乾杯! – Sisyphe

相關問題