2011-10-19 75 views
0

我想讓ListBoxItem觸發兩個事件,我可以從包含ListBox的外部用戶控件捕獲兩個事件。這是我到目前爲止:WPF中的ListBoxItem的MouseOver和IsSelected事件

<ListBox 
      Background="Black" 
      Selected="listbox_selected" 
      x:Name="listBox"> 

      <ListBox.Resources> 
       <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" 
         Value="True"> 
          <Setter Property="IsSelected" Value="True" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ListBox.Resources> 
     </ListBox> 

現在,這調用我的listbox_Selected事件。我想要的是當IsMouseOver調用不同的事件或屬性時。爲了說清楚,我知道如何更改ListBoxItem本身的背景/前景或其他屬性。但我想改變祖父母的一些東西。

+1

爲什麼不綁定到IsSelected屬性從父到子?而不是相反。 – Tigran

回答

1

您已經擁有了事件......從呼籲任何始祖「選定」(和也有「未選中」)ListBoxItem類處理靜態路由事件,在任何地方的後代只要我們不處理「選擇」事件樹...

<Window x:Class="...." 
      ... 
      ListBoxItem.Selected="OnListBoxSelected"> 
    <Grid> 
     <ListBox ItemsSource="{Binding Employees}" 
       DispalyMemberPath="Name" 
       selectedValuePath="ID" > 
     <ListBox.Resources> 
      <Style TargetType="ListBoxItem" 
        BasedOn="{StaticResource 
           {x:Type ListBoxItem}}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsMouseOver, 
              RelativeSource={RelativeSource 
               Self}}" 
           Value="True"> 
         <Setter Property="IsSelected" 
           Value="True" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.Resources> 
     </ListBox> 
    </Grid> 
</Window> 

而且在後面的代碼...

private void OnListBoxSelected(object sender, RoutedEventArgs e) 
    { 
     var window = sender as Window; 
     var listBoxItem = e.OriginalSource as ListBoxItem; 
     var selectedItem = listBoxItem.DataContext; 
    } 

希望這有助於...

+0

這不起作用,因爲這是我卡住的地方。現在,鑑於上述解決方案,我如何處理真實的物品選擇事件?有了這個,我正在劫持OnListBoxSelected事件。我需要選擇項目和項目懸停事件。 – ashokgelal

+0

我不明白'劫持'這個詞?對我來說它不是黑客或劫持。路由冒泡事件是WPF爲您提供的解決方案,當您希望將某個事件從最深的子(ListBoxItem)處理到最頂層的父級(ListBox)時。你還沒有解釋爲什麼你需要懸停事件。 –