2013-03-18 3 views
0

Я хочу создать пользовательский «Wizard» -Control.ItemsControl - Custom ItemContainer

Итак, я получил «Мастер» из Селектора и создал «WizardPage», полученный из HeaderedContentControl. Все работает отлично, когда я добавляю «WizardPages» непосредственно к самому «Мастере».

В Код: Это работает

<ctrl:Wizard> 
    <ctrl:WizardPage Header="Page 1" Content="Some Stuff" /> 
</ctrl:Wizard> 

Тогда я подумал: Эй, это было бы здорово, если вы можете положить случайные вещи в содержании мастера и в случае необходимости он создает оболочку вокруг нее, так же, как ListBox с ListBoxItems (мне определенно нужна оболочка, потому что WizardPage нуждается в свойствах «CanLeavePage» и «AlreadyVisited»).

В Код: Я хочу, что это работает (группы список любой другой, который я могу шаблон где-WizardPage)

<ctrl:Wizard ItemsSource="{Binding Groups}" /> 

Так что я пробовал:

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

protected override DependencyObject GetContainerForItemOverride() 
{ 
    return new WizardPage(); 
} 

Когда я установить точки останова по этим двум методам я вижу, что IsItemItsOwnContainer вызывается, но GetContainerForItemOverride никогда не вызывается.

Что мне здесь не хватает?

Концепция выглядит следующим образом:

SetupWizard

+0

Ваш подход кажется прекрасным для меня, и я не вижу проблемы. Так в чем же проблема? Является ли картина не тем, что вы хотите? Как выглядит ваша WizardPage? В коде и в xaml. Есть ли у него контент? Вы переопределили стиль по умолчанию как для вашего элемента управления, так и для вашего контейнера? Использование [snoop] (http://snoopwpf.codeplex.com/) - отличная помощь в поиске ошибок с элементами вида в wpf. – dowhilefor

+0

WizardPage - это только HeaderedContentControl с некоторыми дополнительными свойствами. – Jens

+0

Моя проблема в том, что ItemsContainerGenerator не генерирует элементы. – Jens

ответ

1

Ok после проверки кода его ясно, почему он не работает. Класс Wizard - это селектор, поэтому его элемент ItemsControl, но в вашем шаблоне управления мастером вы не используете какой-либо элемент ItemsControl, внутри шаблона вы используете ListBox, который сам является элементом ItemsControl, и там вы связываете The Items Wizards ItemsSource с ItemsSource списка. Таким образом, в ListBox теперь ItemContainerGenerator вызывается для создания ListBoxItems, потому что эффективно окно списка выполняет всю работу, а мастер ничего не делает, кроме перенаправления свойства ItemsSource.

Вам необходимо в значительной степени изменить свой шаблон мастера, чтобы он работал. Btw. вы можете легко получить класс Wizard из ListBox.

+0

Точно. Я попробовал «ItemsPresenter» вместо listBox, но это не сработало. Что вы подразумеваете под «сильно модифицировать»? – Jens

+0

Не помещайте ListBox внутри элемента ItemsControl. Вы хотите, чтобы ваш ItemsControl был фактическим элементом ItemsControl или вы хотите, чтобы он размещал другой элемент ItemsControl?Вам нужен элемент ItemsPresenter, и если вы используете ItemPresenter, вам нужно поставить ItemsPanel, поэтому ваш ItemsControl знает, как развернуть отдельные элементы. Вы также можете использовать панель непосредственно в своем ControlTemplate и установить свойство [IsItemsHost] (http://msdn.microsoft.com/en-us/library/system.windows.controls.panel.isitemshost.aspx) – dowhilefor

+0

КПП. Рассматривали ли вы возможность переопределить TabControl для своей цели? В WPF я следую общей рекомендации о том, как создавать новые элементы управления. Если вам нужно что-то предпринять, выполните следующие действия: Изменить свойства или стиль <> Использовать прикрепленные действия <> Новый элемент управленияTemplate <> UserControl <> Подкласс ближайшего элемента управления (Listbox, TextBox) <> CustomControl (ItemsControl, ContentControl, Control) <> Подкласс Visual. – dowhilefor

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