2012-01-04 2 views
1

Dans le code ci-dessous, dans l'événement ColumnsListBox_Loaded, cette méthode renvoie null pour les derniers éléments ListBox. Une idée pourquoi cela se passe-t-il? Je suis des données liant la zone de liste dans l'événement OnOpned() de la classe ChildWindow, puis récupérant ces éléments dans l'événement Loaded() de la classe ListBox.ItemContainerGenerator.ContainerFromItem renvoie null pour les derniers éléments

public partial class SPListColumns : ChildWindow 
    { 
     Web site; 
     List spList; 
     ListItemCollection listItems; 
     string listName; 
     public DataGrid MainGrid; 

     public SPListColumns(string listName, DataGrid MainGrid) 
     { 

      InitializeComponent(); 
      if (!string.IsNullOrEmpty(listName)) 
      { 
       this.listName = listName; 

      } 

      this.MainGrid = MainGrid; 
     } 

     void ColumnsListBox_Loaded(object sender, RoutedEventArgs e) 
     { 

      foreach (DataGridTextColumn columnValue in ColumnsListBox.Items) 
      { 

       ListBoxItem li = ColumnsListBox.ItemContainerGenerator.ContainerFromItem(columnValue) as ListBoxItem; 
       if (li != null) 
       { 

        if (MainGrid.Columns.First(s => s.Header == columnValue.Header).Visibility == System.Windows.Visibility.Collapsed) 
        { 
         li.IsSelected = false; 
        } 
        else 
        { 
         li.IsSelected = true; 
        } 

       } 

      } 
     } 

     protected override void OnOpened() 
     { 
      base.OnOpened(); 
      ColumnsListBox.Loaded += new RoutedEventHandler(ColumnsListBox_Loaded); 
      BindColumns(listName); 
     } 

     private void OKButton_Click(object sender, RoutedEventArgs e) 
     { 
      this.DialogResult = true; 



      foreach (DataGridTextColumn columnValue in ColumnsListBox.Items) 
      { 

       ListBoxItem li = ColumnsListBox.ItemContainerGenerator.ContainerFromItem(columnValue) as ListBoxItem; 
       if (li != null) 
       { 
        if (!li.IsSelected) 
        { 
         MainGrid.Columns.First(s => s.Header == columnValue.Header).Visibility = System.Windows.Visibility.Collapsed; 
        } 
       } 

      } 

     } 

     private void CancelButton_Click(object sender, RoutedEventArgs e) 
     { 
      this.DialogResult = false; 
     } 

     private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

     } 

     private void BindColumns(string listName) 
     { 

       ColumnsListBox.Items.Clear(); 
       ColumnsListBox.ItemsSource = MainGrid.Columns; 
     } 
    } 

Répondre

1

Le ListBox peut utiliser la virtualisation pour éviter de générer des conteneurs pour les articles qui ne sont pas affichés (ce qui serait la raison pour laquelle les premiers éléments fonctionnent très bien pour vous).

Voir theseanswers.

Vous pouvez ne rechercher que les conteneurs pour les éléments visibles; ou hériter ListBox pour remplacer PrepareContainerForItemOverride pour accéder au conteneur tel qu'il est (ré) utilisé si vous voulez faire quelque chose à la volée; ou désactivez la virtualisation (remplacez le ItemsPanel par un StackPanel au lieu de VirtualizingStackPanel).

Questions connexes