2017-07-27 1 views
0

Désolé si c'est trop primitif mais j'ai cherché et trouvé rien pour résoudre mon problème.Comment ajouter un événement souris à un élément ListBox de modèle personnalisé?

J'ai ce modèle de contrôle pour ma liste article:

<ControlTemplate TargetType="{x:Type ListBoxItem}"> 
       <Grid> 
        <Border x:Name="outerBorder" BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0" SnapsToDevicePixels="true"> 
         <Border x:Name="innerBorder" Background="{TemplateBinding Background}" BorderThickness="1" CornerRadius="0" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
          <DockPanel LastChildFill="False" > 
           <StackPanel Orientation="Horizontal" DockPanel.Dock="Left"> 
            <Label x:Name="iconi" Content="#" Foreground="Red"/> 
                      <ContentPresenter Content="{Binding YearClass}" ContentSource="Binding YearClass" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 

           </StackPanel> 
           <Border x:Name="NumBorder" MinWidth="20" Height="20" DockPanel.Dock="Right" Background="#8395bb" CornerRadius="10" > 
            <Label x:Name="BookNum" Content="{Binding Path=NumbOfBook}" Foreground="#ffffff" FontSize="10" /> 
           </Border> 
          </DockPanel> 
         </Border> 
        </Border> 
       </Grid> 

Et ce code font la source de données pour la zone de liste:

public void fill_lib() 
    { 
     List<YearBook> yeartitles = new List<YearBook>(); 
     yeartitles.Add(new YearBook() { xContent ="One", YearClass = "first year", NumbOfBook = 17, selectlink = "openWind" }); 
     yeartitles.Add(new YearBook() { xContent = "Two", YearClass = "second year", NumbOfBook = 5, selectlink = "showItem" }); 
     yeartitles.Add(new YearBook() { xContent = "three", YearClass = "third year", NumbOfBook = 14, selectlink = "dataTemp" }); 

     middleone.ItemsSource = yeartitles; 
    } 

Ma question est de savoir comment puis-je Ajouter un événement de clic de souris ou l'événement sélectionné deux mes éléments de liste?

+0

vous n'avez pas besoin de passer outre ListBoxItem.Template pour afficher les champs personnalisés. Utilisez simplement la propriété ItemTemplate de ListBox. ControlTemplate avec des liaisons à DataContext (comme '" {Binding Path = NumbOfBook} "') est difficilement réutilisable – ASh

+0

quel événement souris et dans quel but voulez-vous avoir? pensez à utiliser la propriété SelectedItem avec l'événement SelectedItemChanged ou considérez InputBindings – ASh

+0

Désolé, j'ai modifié ma dernière ligne de question sur l'événement que je souhaite. événement sélectionné ou clic de souris – hemarn

Répondre

1

Vous ne devez pas remplacer le modèle ListBoxItem pour afficher les champs personnalisés. En utilisant la propriété ItemTemplate de ListBox, vous pouvez obtenir ce que vous voulez. quelque chose comme ceci:

<ListBox x:Name="mainbox" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0,0,0,5"> 
         <Rectangle Width="15" Height="15" Fill="Green" Margin="0,0,5,0"/> 
         <TextBlock Text="{Binding BaseName}" Margin="0,0,5,0" /> 
         <Border CornerRadius="12" Background="#FFB05656" MinWidth="15"> 
          <TextBlock Text="{Binding BaseBookCount}" /> 
         </Border> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Dans ce cas, vous avez accès aux événements de ListBox et si vous souhaitez récupérer des données de ListBoxItem vous pouvez utiliser ce code:

private void mylst_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      //recive item data as user type (that I defined) 
      var text = (mylst.SelectedItem as User); 
      Console.WriteLine(text.Name.ToString()+ " "+ text.Mail.ToString()); 
     } 
0

Regardez dans les gestionnaires d'événements qui peuvent gérer votre clic. Voici un exemple de code qui réagira chaque fois que vous modifiez l'index sélectionné dans votre ListBox.

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      //do something 
     }