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> 
Другие вопросы по тегам