2009-03-24 5 views
4

Я создал пользовательскую панель (MyCustomControl), которая может содержать другие элементы управления и настраиваться с помощью свойств зависимостей. Внутри другого пользовательского элемента управления (MyUserControl) у меня есть несколько экземпляров MyCustomControl, настроенных в XAML.Использование списка <UIElement> как ItemsSource для элемента ItemsControl заставляет DataTemplate не применяться

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

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

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

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

Edit: Я нашел другой пользователь, который имел тот же вопрос, не перечисленного разрешения здесь: msdn social forum post

+0

См. Ответ на этот вопрос [http://stackoverflow.com/questions/661831/wpf-itemtemplate-not-acting-as-expected) – Arcturus

ответ

5

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

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

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

+0

Спасибо, это сработало! Мне пришлось немного изменить определение метода ... protected override bool IsItemItsOwnContainerOverride (объект объекта) – YeahStu