我需要在一个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>
DynamicGrid
是Grid
类型的属性。基于一些条件和计算,我创建了不同数量的TextBox
(每分钟),并设置了一个列表属性TextBoxList
。我需要将这些TextBox
放在DynamicGrid
中。
foreach (var textBox in TextBoxList)
{
DynamicGrid.Children.Add (textBox); // Here I get the exception
}
但是在foreach
循环中出现了这个异常:
指定的Visual已经是另一个Visual
的子级或CompositionTarget
的根。
有什么建议吗?
1条答案
按热度按时间webghufk1#
在WPF中,每个控件在元素树中只能有一个父级。这是一个设计决定。如果不这样实现,例如
DataContext
继承或相对源绑定将不明确,其他机制也将失败。指定的Visual已经是另一个
Visual
的子级或CompositionTarget
的根。错误消息会告诉您,某个控件已经加入为另一个控件的子系,有效地设定了它的父代,但是您尝试指派另一个父代,这在从目前的控件卸离之前是不合法的。
这会在程式码中留下两个会触发错误的案例。
1.您先前已将
TextBox
新增至DynamicGrid
,并尝试在第二次执行时新增相同的执行严修,但不移除先前的执行严修。在此情况下,您可以在再次填入DynamicGrid.Children.Clear();
之前,移除DynamicGrid
的所有子系。1.您清除了
DynamicGrid
,但是您的TextBoxList
包含重复的项目,因此您重复使用了多次添加到DynamicGrid
的同一个TextBox
示例。您可以使用LINQ检查此情况。在这种情况下,请确保为每个项目创建唯一的
TextBox
示例。