WPF Создавайте пользовательский элемент управления динамически при изменении observablecollection ИЛИ Визуализируйте вложенные ObservableCollections с помощью вложенных пользовательских элементов управления.
Я новичок в WPF и не могу найти решение своей проблемы.
У меня есть наблюдаемая коллекция в моей модели представления:
ObservableCollection<Process>
Внутри класса Process есть еще одна ObervableCollection:
ObservableCollection<BurstTime>
Я хочу динамически добавлять новый пользовательский элемент управления (что может визуализировать фактическое состояние данных процесса и время его посылки) в одну из моих StackPanel в моем представлении каждый раз, когда активируется новый процесс, и удалять его, когда процесс закончилась (когда изменяется наблюдаемая коллекция). Во время ее запуска я хочу показать ее коллекцию Burst Time, что может измениться во времени.
Я пытался подписаться на событие CollectionChanged в коде моего пользовательского элемента управления и использовать пользовательский элемент управления в другом пользовательском элементе управления и динамически создавать требуемые TextBlocks при запуске моего обработчика событий, но я всегда получаю исключение System.Reflection.TargetInvocationException (внутреннее исключение: система.NullReferenceException), когда мой внешний InitializeComponent() работает..
public ResourceUseView()
{
InitializeComponent();
((ObservableCollection<Process>)DataContext).CollectionChanged += ResourceUseView_CollectionChanged;
}
Возможно ли это сделать? Можно ли создавать или удалять пользовательские элементы управления в коде моего внешнего UserControl, реагируя на изменения элемента Observable Collection, и обновлять внешний элемент при изменении элемента во внутренней Observable Collection? Существуют ли другие способы, чем создание экземпляра UserControl внутри другого пользовательского элемента управления динамически? Есть ли специальный элемент управления, что может отображать Observable Collection в Observable Collection?
(Если это возможно, я бы хотел иметь разные пользовательские элементы управления так же, как элементы, которые есть у моей Observable Collection..)
Спасибо за вашу помощь!
1 ответ
Конструктор выполняется до привязки данных, поэтому вы, вероятно, видите эту ошибку, потому что DataContext
является null
в то время конструктор рун.
Чтобы привязать к коллекции, используйте элемент управления, который содержит ItemsSource
имущество. И если вы хотите привязать к вложенной коллекции, измените ItemTemplate
элемента управления, чтобы использовать другой элемент управления с ItemsSource
свойство для вложенной коллекции.
Вот пример использования ItemsControl
<ItemsControl ItemsSource="{Binding Processes}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding BurstTimes}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
У меня есть несколько примеров ItemsControl
в моем блоге, если вам интересно.
Если вы хотите указать UserControl
для каждого объекта, затем установите ItemTemplate
для первого ItemsControl
быть ProcessUserControl
и внутри ProcessUserControl
есть ItemsControl
связан с BurstTimes
и использовать BurstTimeUserControl
ибо это ItemTemplate
<ItemsControl ItemsSource="{Binding Processes}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:ProcessUserControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
...
<UserControl x:Class="MyNamespace.ProcessUserControl ...>
...
<ItemsControl ItemsSource="{Binding BurstTimes}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:BurstTimeUserControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
...
</UserControl>