该元素已经是TabControl中另一个元素的子元素

时间:2014-08-26 14:25:37

标签: c# .net wpf silverlight silverlight-5.0

我正在处理Silverlight,并且遇到一个非常奇怪的问题,它不会给出任何异常,也不会在断点处运行时中断。 所以我在app.xaml.cs的

处保留了一个断点
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
 //something here
}

在调试它中断时,我发现在“e”中我有以下未处理的异常:

{System.InvalidOperationException: The element is already the child of another element. 
    to MS.Internal.XcpImports.CheckHResult (UInt32 hr) 
    to MS.Internal.XcpImports.SetValue (IManagedPeerBase obj, DependencyProperty property, DependencyObject doh) 
    to MS.Internal.XcpImports.SetValue (IManagedPeerBase doh, DependencyProperty property, Object obj) 
    to System.Windows.DependencyObject.SetObjectValueToCore (DependencyProperty dp, Object value) 
    to System.Windows.DependencyObject.SetEffectiveValue (DependencyProperty property, EffectiveValueEntry & newEntry, Object newValue) 
    to System.Windows.DependencyObject.UpdateEffectiveValue (DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry & newEntry, ValueOperation operation) 
    to System.Windows.DependencyObject.RefreshExpression (DependencyProperty dp) 
    System.Windows.Data.BindingExpression.SendDataToTarget to () 
    System.Windows.Data.BindingExpression.SourceAcquired to () 
    to System.Windows.Data.Binding.EnsureBreakPoint (BindingDebugState debugState, Action callback, Boolean canDelay) 
    to System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(Object sender, e DataContextChangedEventArgs) 
    to System.Windows.Data.BindingExpression.DataContextChanged (Object sender, e DataContextChangedEventArgs) 
    to System.Windows.FrameworkElement.OnDataContextChanged (DataContextChangedEventArgs e) 
    to System.Windows.FrameworkElement.OnTreeParentUpdated (DependencyObject newParent, Boolean bIsNewParentAlive) 
    to System.Windows.DependencyObject.UpdateTreeParent (IManagedPeer oldParent, IManagedPeer newParent, bIsNewParentAlive Boolean, Boolean keepReferenceToParent) 
    to MS.Internal.FrameworkCallbacks.ManagedPeerTreeUpdate (oldParentElement IntPtr, IntPtr parentElement, IntPtr childElement, bIsParentAlive Byte, Byte bKeepReferenceToParent, Boolean canCreateParent)}

现在发生时:

我有TabControl,其中包含3个标签项。 一个Tabitem显示xml代码,第二个显示c#代码,第三个(讨厌的一个)显示使用c#动态创建的UI元素。

现在上面的TabControl(已经包含3个TabItems)被存储为另一个TabItem的内容(这里的结果在我的代码中),就像这样,它是所有人的父类。

(所以你可以看到第一个是“结果”然后它包含“TabControl”然后它包含“3个TabItems”) 此result存储在ObservableCollection<TabItem> result = new ObservableCollection<TabItem>(); 中,我的意思是它会有两个类似于结果的列表。此集合中的每个“结果”都负责在给定的三个选项卡项中呈现不同对象的信息(在此ObservableCollection列表中,Tabitem中的xml,代码和UI元素呈现为选定结果(tabitem))。

问题发生时? :

只有当我从一个结果TabItem切换到另一个结果TabItem然后回到相同的“TabItem”(它负责UI元素呈现,请注意它只发生在此TabItem,而不是其他两个)(仅用于我称为“讨厌”的Result的第三个TabItem,它应该是动态创建的UI元素。它会崩溃我的项目并给出未处理的异常

有人可以通过解决方案让我知道这个问题的原因吗?非常感谢。

编辑:(请参阅解释以避免混淆)

假设我的可观察TabItem集合中有两个“Result”tabitems,每个“Result”代表不同的对象,并在点击每个Result(TabItem)的TabControl的第三个TabItem时呈现不同的UI元素。在开始的时候,我点击第一个“结果”的第3个TabItem(令人讨厌的,其中Ui元素)它现在再次工作正常我点击第二个“结果”的第三个标签项目它仍然正常工作并呈现UI元素替换第一个。现在当我第二次点击回到第一个“结果”的第三个TabItem然后它来了(我的意思是第一个我点击第一个结果的第三个tabitem然后我点击第二个结果的第三个TabItem,直到它工作正常并且渲染两个不同的UI元素在不同点击同一个地方,但 nowx当我回到第一个结果的第三个标签时,它崩溃应用程序与该异常

注意:请不要动态地在c#中完成这三个TabItem的绑定。

1 个答案:

答案 0 :(得分:3)

这不是一个奇怪的问题,这是一个非常普遍的问题。此外,错误信息真的不能太清楚:

The element is already the child of another element. 

WPF中的每个UI元素一次只能在一个位置的UI中使用。我们可以移动它们,或者从一个位置删除它们并将它们添加到另一个位置,但我们不能一次在两个地方添加相同的元素

因此(不查看所有代码),我只能假设您已尝试使用动态创建的TabControl中UI中已存在的对象。一旦找到有问题的元素,可以在复制used元素的值之后将其与新元素交换。完成后,您应该有更多的运气来展示您的第三个TabItem