2011-08-02 6 views
0

Désolé si la syntaxe est éteint, je dactylographiées ceci sur le Bloc-notes, (temp. Problèmes avec ordinateur VS)WPF ajouter de nouveaux éléments à une zone de liste

j'ai une classe Movie avec une propriété Title, j'ai

La propriété movieList a été initialisée avec des valeurs temporaires, la dernière étant "New"
Dim movieList = New ObservableCollection(of Movie) 

Private Sub SelectMovie(ByVal sender As Object, ByVal e As SelectionChangedEventArgs) 

    For Each m As Movie in movieList 
    If lb1.SelectedItem = "New" Then 
     m.Add(New Movie()) 
    End If 
    Next 

End Sub 


Dans le constructeur j'ai itéré par movielist et mettre des choses dans la liste.

lb1.Items.Add(m) 

Dans le MainWindow.xaml j'ai

<Grid Name="moviePage" > 
    <ListBox Name="lb1" SelectionChanged="SelectMovie"> 
</Grid> 

Je suis conscient que cette approche est erronée je modifier une liste en utilisant, mais je ne peux pas sembler trouver un moyen de contourner cela.

L'idée est simplement d'avoir la liste déroulante afficher un tas de films, avec la possibilité d'ajouter un nouveau film si "Nouveau" est sélectionné dans la liste.

+1

Quelle est votre question? Est-ce que votre code ne fonctionne pas? –

+0

un moyen de le faire qui ne causera pas d'erreurs. Je recevais une erreur indiquant que je ne peux pas ajouter des éléments à la matrice pendant que je suis itérer à travers elle. Ma comp. qui a VS a des problèmes en ce moment, alors j'ai tapé ceci en utilisant ce que je me souviens qui se passait. Je ne peux pas penser à autre chose en ce moment, toutes les idées sont appréciées – heyNow

Répondre

4

Voici un exemple de code de travail:

public MainWindow() 
{ 
    InitializeComponent(); 

    _movies = new ObservableCollection<Movie>(
     new[] 
     { 
      new Movie { Name = "Foo" }, 
      new Movie { Name = "Bar" }, 
      new Movie { Name = "(New)" }, 
     }); 
    lb1.ItemsSource = _movies; 
} 

ObservableCollection<Movie> _movies; 

private void SelectMovie(object sender, SelectionChangedEventArgs e) 
{ 
    var selectedMovie = lb1.SelectedItem as Movie; 
    if (selectedMovie == null) return; 

    if (selectedMovie.Name == "(New)") 
    { 
     var newMovie = new Movie { Name = "Untitled" }; 
     _movies.Insert(_movies.Count - 1, newMovie); 
     lb1.SelectedItem = newMovie; 
     e.Handled = true; 
    } 
} 

Cela dit, je ne crois pas que ce soit la bonne approche pour ce que vous faites. Je pense que vous feriez mieux de changer le template pour le ListBox afin qu'il montre la liste des éléments auxquels il est lié, puis un bouton ou un lien "Nouveau" en bas (en dehors de la liste).

Voici un exemple très simple:

<ListBox x:Name="lb1" DisplayMemberPath="Name" SelectionChanged="SelectMovie"> 
    <ListBox.Template> 
     <ControlTemplate> 
      <StackPanel> 
       <ItemsPresenter /> 
       <Button Click="AddMovie>New Movie</Button> 
      </StackPanel> 
     </ControlTemplate> 
    </ListBox.Template> 
</ListBox> 

Alors maintenant, vous avez une ListBox qui comprend un bouton pour créer un nouveau film. Dans votre gestionnaire d'événements AddMovie, vous pouvez ajouter une nouvelle instance Movie à la liste et la sélectionner.

+0

suggestions assez utiles, Merci! – heyNow

Questions connexes