Wpf ItemsControl-自定义ItemContainer

Wpf ItemsControl-自定义ItemContainer,wpf,itemscontrol,Wpf,Itemscontrol,我想创建一个自定义“向导”-控件 因此,我从选择器派生了一个“向导”,并从HeaderedContentControl派生了一个“向导页面”。当我将“WizardPages”直接添加到“Wizard”的内容本身时,一切正常 在代码中:这是有效的 <ctrl:Wizard> <ctrl:WizardPage Header="Page 1" Content="Some Stuff" /> </ctrl:Wizard> 当我在这两个方法上设置断点时,我可以

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

因此,我从选择器派生了一个“向导”,并从HeaderedContentControl派生了一个“向导页面”。当我将“WizardPages”直接添加到“Wizard”的内容本身时,一切正常

在代码中:这是有效的

<ctrl:Wizard>
    <ctrl:WizardPage Header="Page 1" Content="Some Stuff" />
</ctrl:Wizard>
当我在这两个方法上设置断点时,我可以看到ISitemTownContainer被调用,但GetContainerForItemOverride从未被调用

我错过了什么

概念如下所示:


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


您需要大量修改向导模板才能使其正常工作。顺便说一句,您可以很容易地从列表框派生向导类。

您的方法对我来说很好,我看没有问题。那么,实际问题是什么?这幅画不是你想要的吗?您的向导页面是什么样子的?在代码和xaml中。有什么内容吗?您是否覆盖了items控件和容器上的默认样式?使用可以很好地帮助查找wpf中视图元素的错误。WizardPage只是一个带有一些额外属性的HeaderedContentControl。我的问题是ItemsContainerGenerator不生成项目。好的,您不会生成项目。什么是“团体”财产?里面有什么?视图模型是什么样子的。您需要提供更多信息以更好地帮助您。“组”属性是集合吗?它是一个观察者吗?因为它需要通知视图添加了某些内容。我们需要更多的代码,perfect是一个小的可编译示例,说明什么东西不起作用。我创建了一个VS2012测试项目。我的问题不是左侧列表没有显示,而是ICG没有生成项目:完全正确。我尝试了“ItemsPresenter”而不是listBox,但它不起作用。“大幅度修改”是什么意思?请不要在ItemsControl中放置列表框。您希望您的ItemsControl成为实际的ItemsControl还是希望它承载另一个ItemsControl?您需要ItemsPresenter,如果使用ItemsPresenter,则需要提供ItemsPanel,以便ItemsControl知道如何布局各个项目。您还可以直接在ControlTemplate中使用面板并设置propertyBtw。您是否考虑过为了您的目的重写TabControl?在WPF中,我遵循关于如何创建新控件的一般指南。如果您需要实现某些功能,请按以下顺序尝试:更改属性或样式使用附加行为新建ControlTemplate UserControl子类最近的控件(Listbox,TextBox)CustomControl(ItemsControl,ContentControl,control)子类Visual。好的,我想您给了我一个正确的方向。非常感谢您抽出时间!
<ctrl:Wizard ItemsSource="{Binding Groups}" />
protected override bool IsItemItsOwnContainerOverride(object item)
{
    return item is WizardPage;
}

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