ItemContainerGenerator.ContainerFromItem возвращает значение NULL для последних нескольких элементов - PullRequest
1 голос
/ 04 января 2012

В приведенном ниже коде в событии ColumnsListBox_Loaded этот метод возвращает значение NULL для последних нескольких элементов ListBox. Есть идеи, почему это происходит? Я связываю данные со списком в событии OnOpned () класса ChildWindow и затем извлекаю эти элементы в событии Loaded () класса ListBox.

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

1 Ответ

1 голос
/ 05 января 2012

ListBox может использовать виртуализацию, чтобы избежать создания контейнеров для элементов, которые не отображаются (именно поэтому первые элементы работают для вас нормально).

См. this ответы .

Возможно, вы захотите просматривать в контейнерах только те элементы, которые видны;или унаследуйте ListBox, чтобы переопределить PrepareContainerForItemOverride для доступа к контейнеру, поскольку он (и) используется, если вы хотите что-то сделать на лету;или отключите виртуализацию (измените ItemsPanel на StackPanel вместо VirtualizingStackPanel).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...