2016-07-26 2 views
0

Редактировать:
Простой ответ: Да. Я обнаружил ошибку, которая заключалась в том, что был добавлен другой обработчик событий, каждый раз, когда был запущен Combobox_SelectionChanged. Следовательно, коллекция выглядела отлично, но Items_CollectionChanged был запущен несколько раз. Как только это было исправлено, все сработало нормально.
End Edit.Does Grid.Children.Clear() действительно удалить все элементы управления?

У меня есть страница со списком и сеткой. Сетка заполняется динамически, когда выбор в поле со списком изменяется. Теперь я наблюдаю странную вещь. Когда я выбираю значение во второй раз в поле со списком, дочерние элементы в сетке появляются дважды. Я проверил базовые коллекции, которые выглядят отлично (т. Е. Только одна запись за элемент). Когда я выпрыгиваю из метода combobox_SelectionChanged, после команды Grid.Children.Clear() экран выглядит отлично, т. Е. Пустым.

Моя догадка заключается в том, что Grid.Children.Clear() удаляет элементы управления только из визуального дерева, но фактические элементы управления все еще висят вокруг. Есть идеи?

private void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    grItems.Children.Clear(); 
    grItemsColumnDefinitions.Clear(); 
    grItemsColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(200) }); 
} 

    private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 

     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      grItems.Children.Add(new ChildItemControl(e.NewItems[0])); 
     } 

    } 

Edit: Все это должно выглядеть так (вымышленный - но, надеюсь, понятно - например) enter image description here

+0

Просто интересно, есть причина, вы не можете использовать привязки для этого вместо того, чтобы добавлять вещи в сетку вручную? – Charleh

+0

Ну, одна из причин - отсутствие навыков xaml;) Но другая заключается в том, что сама структура довольно сложна, а также способ ее отображения. Там было еще несколько вертикальных и горизонтальных слоев (дни, покупатели, отделы, aso). Поэтому мне стало легче обрабатывать, если элементы управления добавлены в код. –

+0

Вы не должны думать, что «структура» данных слишком сложна для привязки данных. Чем сложнее данные, тем больше вы должны полагаться на привязку данных, поскольку вы обязаны делать больше ошибок в своей логике бэкэнд, чем вы должны делать в своих шаблонах привязки. Взгляните на образец MVVM в разделе «Документация» SO: http://stackoverflow.com/documentation/wpf/2134/simple-mvvm-example#t=201607261427091123224 –

ответ

1

Я хотел бы предложить вам использовать встроенный в Databinding для WPF. Вы могли бы использовать что-то вроде этого:

<DataGrid x:Name="grItems" ItemsSource="{Binding comboboxItems}" /> 

Затем, когда вы обновляете comboboxItems вашей сетки будет автоматически обновлять тоже!
Вот большая статья о Databinding с контролем DataGrid: http://www.wpftutorial.net/DataGrid.html

Для получения дополнительной информации о Databinding в целом, здесь хорошая статья: https://msdn.microsoft.com/en-us/library/aa480224.aspx

Смежные вопросы