Использование List <UIElement>в качестве ItemsSource для ItemsControl приводит к тому, что DataTemplate не применяется - PullRequest
4 голосов
/ 24 марта 2009

Я создал пользовательскую панель (MyCustomControl), которая может содержать другие элементы управления и настраиваться через свойства зависимостей. Внутри другого пользовательского элемента управления (MyUserControl) у меня есть несколько экземпляров MyCustomControl, настроенных в XAML.

За пределами пользовательского элемента управления я пытаюсь привязать ItemsControl (myItemsControl) к списку MyCustomControl, которые существуют в MyUserControl во время выполнения. Поэтому я выставил список из MyUserControl через свойство зависимостей.

Я испытываю неожиданное поведение от этой стратегии. Я хотел бы, чтобы ItemsControl взял List и использовал каждый экземпляр элемента управления как объект со значениями данных, которые могут заполнять DataTemplate ItemsControl. Однако этого не происходит. Вместо этого он полностью игнорирует DataTemplate и просто повторно отображает все элементы управления, которые находятся в списке / ItemsSource.

В итоге, если я использую список элементов управления в качестве ItemsSource для ItemsControl, он не использует их в качестве объектов данных, а вместо этого отображает их как экземпляры элементов управления.

Удивительно, но если я пытаюсь сделать то же самое, но использую ListBox вместо ItemsControl, привязка данных работает, как и ожидалось. Я не хочу использовать ListBox по другим причинам. Кто-нибудь знает, в чем разница между ListBox и ItemsControl, который влияет на это поведение?

Редактировать: Я нашел другого пользователя, у которого возникла та же проблема без разрешения в списке: msdn сообщение на форуме

1 Ответ

5 голосов
/ 24 марта 2009

После использования Reflector для проверки кода ItemsControl метод IsItemItsOwnContainerOverride возвращает значение true, если элемент является UIElement. Вы можете создать подкласс ItemsControl и изменить этот метод на:

protected override bool IsItemItsOwnContainerOverride(object item)
{
    return (item is ContentPresenter);
}

Если вы затем используете этот класс вместо ItemsControl, он будет работать как положено, но не будет иметь нежелательных функций ListBox.

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