如何制作只有特殊类型的 ItemsControl?

How to make an ItemsControl that has only the special type?

我的英语水平很差,因为我的母语不是英语。 希望您能理解。

我想构造一个只能接收特殊类型的控件。 我正在考虑构建它派生 ItemsControl。 首先,我试图构建它派生面板,但我认为这种方式不适合这个主题,所以我尝试使用 ItemControl。

无论如何,我的问题是 ItemsControl 的 ItemCollection 可以具有所有类型,但我希望我尝试构建的控件只有一种特殊类型。

例如,我期望的代码构造如下。 (我尝试构建的控件名称假定为 "DockManager"。) ("DockManager" 可以有的特殊类型的名称,假定 "DockLayout" 和 "DocumentLayout"。)

一个成功的例子。

<DockManager>
    <DockLayout Header="example" Content="{Binding}" DockManager.Dock="Top"/>
    <DockLayout Header="example2" Content="{Binding}" DockManager.Dock="Bottom"/>
    <DocumentLayout Header="example2" Content="{Binding}"/>
</DockManager>

失败示例

<DockManager>
    <Grid/>      <-- Error : DockManager can't has the Grid control.
    <TextBox/>   <-- Error : DockManager can't has the TextBox control.
</DockManager>

我能否在ItemsControl 的基础上实现上述目标? 我不愿意依附于 ItemsControl。 如果你有更好的方法可以达到上述目标,能不能教教我一下?

感谢阅读

Could I reach the above goal in the base on ItemsControl?

简答:否。

一个 ItemsControl 有一个 ItemsSource 属性 可以设置为任何 IEnumerable 并且你不能通过创建一个新的 API 来改变这个 API class 派生自它。

因此,如果您想要一个仅适用于特定类型项目的控件,您基本上必须从头开始创建您自己的自定义控件。您可以查看 source code of the ItemsControl 并从那里开始。