2010-11-30 18 views
2

J'ai une question de concept sur la façon d'avoir une liste dynamique affichée par une zone de liste. Dans la zone de liste, les éléments sont conservés dans un Stackpanel. Dans le panneau de pile est une chaîne et un bouton. Si je clique sur ce bouton, cette entité/élément (à la fois le bouton et la chaîne) est supprimé de la zone de liste.Comment inclure des boutons et mapper leurs événements dans un ListBox?

1) Comment créer de nouveaux boutons en fonction du nombre d'entités dans la liste?
2) Comment connecter l'idée que ce bouton est lié à cet élément dans la liste?
3) Est-ce encore possible avec une liaison? Désolé, je suis encore nouveau sur WPF mais je commence à voir que c'est assez puissant.

Si vous pouvez également fournir un bref/court exemple, ou me diriger vers un lien similaire, je vous serais très reconnaissant. Merci beaucoup! :)

Répondre

1

Voici un exemple simple de ce que vous pouvez faire. Tout d'abord, la classe source pour le ListBox. Une classe simple qui implémente l'interface INotifyPropertyChanged et une propriété de chaîne.

public class MyClass : INotifyPropertyChanged 
{ 
    public MyClass(string myString) 
    { 
     MyString = myString; 
    } 
    private string m_myString; 
    public string MyString 
    { 
     get 
     { 
      return m_myString; 
     } 
     set 
     { 
      m_myString = value; 
      OnPropertyChanged("MyString"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

La MainWindow a une ObservableCollection de MyClass. Nous avons défini le DataContext pour la fenêtre sur lui-même (this), ce qui fera hériter le DataContext par ListBox afin que nous puissions lier ses ItemsSource à MyClasses.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MyClasses = new ObservableCollection<MyClass>(); 
     MyClasses.Add(new MyClass("My String 1")); 
     MyClasses.Add(new MyClass("My String 2")); 
     MyClasses.Add(new MyClass("My String 3")); 
     this.DataContext = this; 
    } 

    public ObservableCollection<MyClass> MyClasses 
    { 
     get; 
     private set; 
    } 
} 

En xaml, nous avons la ListBox qui se lie à MyClasses. Le ItemTemplate est pour chaque ListBoxItem dans le ListBox, chaque élément se liant à son instance de MyClass, présentant la propriété MyString et un "bouton Supprimer". Le DataContext pour chaque ListBoxItem sera une instance de MyClass.

<ListBox ItemsSource="{Binding MyClasses}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding MyString}" Margin="6"/> 
       <Button Content="Remove" 
         Click="RemoveListBoxItem_Click"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Enfin, nous ajoutons le code derrière EventHanlder pour RemoveListBoxItem_Click dans MainWindow.xaml.cs.

private void RemoveListBoxItem_Click(object sender, RoutedEventArgs e) 
{ 
    // The clicked Button 
    Button button = sender as Button; 
    // The DataContext of the Button will be its instance of MyClass 
    MyClass selectedItem = button.DataContext as MyClass; 
    if (selectedItem != null) 
    { 
     // Remove the MyClass item from the collection 
     MyClasses.Remove(selectedItem); 
    } 
}