ItemsControl元素已经是另一个元素的子元素
本文关键字:元素 另一个 ItemsControl | 更新日期: 2023-09-27 18:15:04
我正在尝试动态添加控件到我的ItemsControl
。我使用RadHubTile
控制,但我认为这适用于任何控制。我的XAML
<ItemsControl x:Name="itemsControl" ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<telerikPrimitives:RadUniformGrid x:Name="radUniformGrid" NumberOfColumns="3" NumberOfRows="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
添加新的控件工作正常,并正确绑定。当我从页面导航离开并返回时,就会出现这个问题。我得到这个错误
MS.Internal.WrappedException: Element is already the child of another element. ---> System.InvalidOperationException: Element is already the child of another element.
at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
at MS.Internal.XcpImports.Collection_AddValue[T](PresentationFrameworkCollection`1 collection, CValue value)
at MS.Internal.XcpImports.Collection_AddDependencyObject[T] (PresentationFrameworkCollection`1 collection, DependencyObject value)
at System.Windows.PresentationFrameworkCollection`1.AddDependencyObject(DependencyObject value)
at System.Windows.Controls.UIElementCollection.AddInternal(UIElement value)
at System.Windows.PresentationFrameworkCollection`1.Add(T value)
at System.Windows.Controls.ItemsControl.AddVisualChild(Int32 index, DependencyObject container, Boolean needPrepareContainer)
at System.Windows.Controls.ItemsControl.AddContainers()
at System.Windows.Controls.ItemsControl.RecreateVisualChildren(IntPtr unmanagedObj)
--- End of inner exception stack trace ---
我怀疑这是因为radHubTile元素已经有父元素。也许我必须从可视化树或从ItemsControl移出页面时删除它们?我试图通过OnBackKeyPress背后的代码做到这一点,但我不确定如何实现这一点。或者这是否能解决问题。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
foreach (var item in itemsControl.Items)
{
UIElement uiElement =
(UIElement)itemsControl.ItemContainerGenerator.ContainerFromItem(item);
//this.itemsControl.Items.Remove(uiElement);
}
}
编辑
当试图删除uiElement
{System.InvalidOperationException: Operation not supported on read-only collection.
有什么建议吗?谢谢。
看起来您正在将一组UI元素(RadHubTile
)绑定到您的ItemsControl
。而不是这样做,你应该在XAML中直接在Items
集合中添加瓷砖到ItemsControl
,或者将瓷砖的数据(非ui)对象集合绑定到ItemsSource
,然后使用ItemTemplate
来声明RadHubTile
控件本身,当创建新的ItemsControl
实例时,它将作为新实例为你生成。
先用Items.Clear()
清除项目