2017-07-27 1 views
0

Tut mir leid, wenn das zu primitiv ist, aber ich suchte und fand nichts, um mein Problem zu lösen.Wie Hinzufügen von Mausereignis zu benutzerdefinierten Vorlage ListBox Element?

Ich habe diese Control Template für meine Listenfeld Artikel:

<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> 

Und dieser Code machen Datenquelle für das Listenfeld:

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; 
    } 

Meine Frage ist, wie kann ich per Mausklick Event hinzufügen oder ausgewähltes Ereignis zwei meine Listenelemente?

+0

Sie nicht außer Kraft setzen müssen ListBoxItem.Template, um benutzerdefinierte Felder anzuzeigen. Verwenden Sie einfach die ItemTemplate-Eigenschaft von ListBox. ControlTemplate mit Bindings zu DataContext (wie '{Binding Path = NumbOfBook}" ') ist kaum wieder verwendbar – ASh

+0

welche Mausereignisse und zu welchem ​​Zweck möchten Sie haben? erwägen, die SelectedItem-Eigenschaft mit dem SelectedItemChanged-Ereignis zu verwenden oder InputBindings zu berücksichtigen. – ASh

+0

Entschuldigung, ich habe meine letzte Fragezeile nach dem gewünschten Ereignis bearbeitet. ausgewählt oder Mausklick-Ereignis – hemarn

Antwort

1

Sie müssen die ListBoxItem-Vorlage nicht überschreiben, um benutzerdefinierte Felder anzuzeigen. Wenn Sie die ItemTemplate-Eigenschaft von ListBox verwenden, können Sie erhalten, was Sie wollen. so etwas wie dieses:

<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> 

In diesem Fall haben Sie Zugriff auf die Ereignisse von List-Box und wenn Sie Daten von ListBoxItem abrufen möchten können Sie diesen Code verwenden:

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

Schauen Sie in Ereignishandler, die Ihren Mausklick verarbeiten können. Hier ein Beispielcode, der immer dann reagiert, wenn Sie den ausgewählten Index in Ihrer ListBox ändern.

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