【问题标题】:Dynamically adding user controls in with names throws "invalid range exception" Silverlight使用名称动态添加用户控件会引发“无效范围异常”Silverlight
【发布时间】:2010-04-06 14:24:33
【问题描述】:

在我的 Silverlight 应用程序中,我有一个事件处理程序,它动态创建用户控件的新实例并将其添加到另一个控件的 Content 属性中。这工作得很好,没有错误,直到我为用户控件分配了一个名称 (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,绑定将无法正常工作。因此,如果我指定名称绑定将起作用,但我无法添加控件。想法?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

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

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

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

    用户控件包含一个根元素,您可以在其中放置其所有 UI,并且该元素(通常是 Grid,但实际上可以是任何 FrameworkElement)通常名称为 LayoutRootFrameworkElement 有一个 Parent 属性,在 UserControl 的布局根的情况下,UserControl 本身。

    【讨论】:

    • 谢谢...成功了。您的 sn-p 缺少 Path 属性。这就是为我做的(我的公共财产被命名为 PaneTitle: Text="{Binding ElementName=LayoutRoot, Path=Parent.PaneTitle}"
    • @AC:我在缺少Path= 的情况下进行了测试,它工作正常,但它只是一点语法糖,最好是明确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多