使用名称动态添加用户控件会引发“无效范围异常”Silverlight

时间:2010-04-06 14:24:33

标签: silverlight

在我的Silverlight应用程序中,我有一个事件处理程序,它动态创建用户控件的新实例,并将其添加到另一个控件的Content属性中。这样可以正常工作而不会出现错误UNTIL我为用户控件指定了一个名称(x:Name =“”)(不是在事件中,而是在用户控件的XAML中。然后,当我将模板设置为.Content属性时控件我得到一个“System.ArgumentException未被用户代码处理/值不在预期的范围内。”异常。我不知道错误在哪里或在哪里看......它几乎嵌入在SL中。无法弄清楚我需要设置的其他属性。

以下是添加用户控件的代码:

TilePane p = e.Element as TilePane; // this is the target
AppTileNormalViewControl template = new AppTileNormalViewControl(); // this is the user control
p.Content = template; // error happens here

这里的问题是用户控件有一些公共属性,我将用于数据绑定到用户控件中的某些控件。我需要一个名字来做语法:

Text="{Binding ElementName=UserControlName, Path=PublicProperty}"

没有ElementName,绑定不起作用。所以,如果我指定名称绑定将起作用,但我无法添加控件。想法?

1 个答案:

答案 0 :(得分:2)

问题是UserControl的Name属性将成为内容控件所属范围内可用元素名称集的一部分。一旦您尝试以这种方式添加其中两个元素,您最终会尝试添加相同的名称,从而导致您看到的错误。

UserControl的名称实际上是usercontrol的使用者的业务,而不是用户控件本身,因此您应该删除此x:Name。一个可行的替代方案是这样的: -

Text="{Binding Parent.PublicProperty, ElementName=LayoutRoot}"

Usercontrol包含一个根元素,您可以在其中放置所有UI和此元素(通常为Grid但实际上可以是任何FrameworkElement)通常是名称LayoutRootFrameworkElement具有Parent属性,对于UserControl的布局根,UserControl本身就是{。}}。