0

我想创建一个自定义的“向导”-控件。

所以我从 Selector 派生了一个“Wizard”,并创建了一个从 HeaderedContentControl 派生的“WizardPage”。当我将“WizardPages”直接添加到“Wizard”的内容本身时,一切正常。

在代码中:这有效

<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 永远不会被调用。

我在这里想念什么?

这个概念看起来像这样:

设置向导

4

1 回答 1

1

好的,检查您的代码后,它清楚为什么它不起作用。您的向导类是一个选择器,因此它是一个 ItemsControl,但是在您的向导控件模板中,您不使用任何 ItemsControl 东西,在模板内您使用一个 ListBox,它本身就是一个 ItemsControl,并且您将向导 ItemsSource 绑定到列表框的 ItemsSource。所以现在在 ListBox 中调用了 ItemContainerGenerator 来生成 ListBoxItems,因为实际上列表框正在完成所有工作,而向导除了重新路由 ItemsSource 属性之外什么都不做。

您需要大幅修改您的向导模板以使其工作。顺便提一句。您可以轻松地从 ListBox 派生 Wizard 类。

于 2013-03-18T15:12:39.513 回答