XAML 动态网格控制:错误-指定的Visual已经是另一个Visual的子级或CompositionTarget的根

ndh0cuux  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(198)

我需要在一个Grid中动态创建一些TextBox es。我把一个ContentControl放在主网格中,并把它绑定到一个名为DynamicGrid的属性。

<Grid>
    <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <ContentControl
                    Grid.Row="0" 
                    Content="{Binding SomethingElse}" />
    <ContentControl
                    Grid.Row="1" 
                    Content="{Binding DynamicGrid}" />
            
</Grid>

DynamicGridGrid类型的属性。基于一些条件和计算,我创建了不同数量的TextBox(每分钟),并设置了一个列表属性TextBoxList。我需要将这些TextBox放在DynamicGrid中。

foreach (var textBox in TextBoxList)
{
   DynamicGrid.Children.Add (textBox);  // Here I get the exception
}

但是在foreach循环中出现了这个异常:
指定的Visual已经是另一个Visual的子级或CompositionTarget的根。
有什么建议吗?

webghufk

webghufk1#

在WPF中,每个控件在元素树中只能有一个父级。这是一个设计决定。如果不这样实现,例如DataContext继承或相对源绑定将不明确,其他机制也将失败。
指定的Visual已经是另一个Visual的子级或CompositionTarget的根。
错误消息会告诉您,某个控件已经加入为另一个控件的子系,有效地设定了它的父代,但是您尝试指派另一个父代,这在从目前的控件卸离之前是不合法的。
这会在程式码中留下两个会触发错误的案例。
1.您先前已将TextBox新增至DynamicGrid,并尝试在第二次执行时新增相同的执行严修,但不移除先前的执行严修。在此情况下,您可以在再次填入DynamicGrid.Children.Clear();之前,移除DynamicGrid的所有子系。
1.您清除了DynamicGrid,但是您的TextBoxList包含重复的项目,因此您重复使用了多次添加到DynamicGrid的同一个TextBox示例。您可以使用LINQ检查此情况。

var areTextBoxesUniqueInstances = TextBoxList.Distinct().Count() == TextBoxList.Count();

在这种情况下,请确保为每个项目创建唯一的TextBox示例。

相关问题