在我的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,绑定不起作用。所以,如果我指定名称绑定将起作用,但我无法添加控件。想法?
答案 0 :(得分:2)
问题是UserControl的Name属性将成为内容控件所属范围内可用元素名称集的一部分。一旦您尝试以这种方式添加其中两个元素,您最终会尝试添加相同的名称,从而导致您看到的错误。
UserControl的名称实际上是usercontrol的使用者的业务,而不是用户控件本身,因此您应该删除此x:Name
。一个可行的替代方案是这样的: -
Text="{Binding Parent.PublicProperty, ElementName=LayoutRoot}"
Usercontrol包含一个根元素,您可以在其中放置所有UI和此元素(通常为Grid
但实际上可以是任何FrameworkElement
)通常是名称LayoutRoot
。 FrameworkElement
具有Parent
属性,对于UserControl
的布局根,UserControl
本身就是{。}}。