【问题标题】:silverlight listbox throwing "value not fall in expected range" even when empty?即使为空,silverlight 列表框也会抛出“值不在预期范围内”?
【发布时间】:2011-06-25 06:04:34
【问题描述】:

我正在以编程方式使用模板控件动态填充silverlight 列表框。 列表框是空的,当我尝试 listBox.Items.Add(myTemplateControl) 时,它会抛出“值不在预期范围内”参数异常。

我在调试器中验证了项目集合确实是空的。 我唯一听说过此异常发生的情况是列表已经包含具有该名称的实例。

有什么想法吗?

堆栈跟踪:

在 MS.Internal.XcpImports.MethodEx(IntPtr ptr,字符串名称,CValue[] cvData) 在 MS.Internal.XcpImports.MethodPack(IntPtr objectPtr, String methodName, Object[] rawData) 在 MS.Internal.XcpImports.Collection_Add[T](PresentationFrameworkCollection`1 集合,对象值) 在 System.Windows.PresentationFrameworkCollection`1.AddImpl(对象值) 在 System.Windows.Controls.ItemCollection.AddImpl(对象值) 在 System.Windows.Controls.ItemCollection.AddInternal(对象值) 在 System.Windows.PresentationFrameworkCollection`1.Add(T 值) 在 KTClientRIA.Documents.b__4(对象发送者,Dow​​nloadStringCompletedEventArgs e) 在 System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e)

【问题讨论】:

  • 你能看到调试器中的参数是什么吗? (对所有异常设置中断)
  • “参数”具体是什么意思?您指的是“myTemplateControl”参数吗?它是一个自定义 XAML 模板控件,继承自 UserControl
  • 否;我的意思是MS.Internal.XcpImports.MethodEx的参数
  • 如果对所有异常设置 Break,它将在该方法内部中断,您应该在 Locals 窗口中看到它的参数。
  • forums.silverlight.net/forums/p/164985/372105.aspx 给它一个唯一的名称。此外,由于您的事件处理中的错误,此时 ListBox 可能不是空的,betcha。

标签: c# silverlight listbox


【解决方案1】:

感谢所有建议。我能够追踪到它。在 silverlight 控件生命周期的另一个时间点,有另一个列表框与添加同名项目的列表框完全分开。 由于两个父列表框都驻留在同一个 silverlight 控件上,因此它正在爆炸。

【讨论】:

    【解决方案2】:

    对于这是一个“未回答”的答案,我提前道歉,但也许它会有所帮助。

    我遇到了完全相同的问题,但使用的是 Accordion 而不是 ListBox。我的控制层次结构是:

    • 用户控件(页面)
      • 手风琴
        • 手风琴Item0
          • 内容控制
            • ReportView0(在运行时动态创建并绑定到 ContentControl 的 Content 属性)
        • 手风琴Item1
          • 内容控制
            • ReportView1(在运行时动态创建并绑定到 ContentControl 的 Content 属性)

    我第一次能够填充手风琴的 ItemSource 并创建 ReportView 控件,但如果我尝试刷新列表(例如,对其进行排序),我会得到“值不在预期范围内”例外。

    我相信正在发生的事情是,当我刷新列表时,我手动创建的 ReportView 项目从未与它们原来的父 ContentControls 解除关联。刷新后,当尝试将 ReportViews 绑定到不同的 AccordionItem 时,会引发异常,因为每个 ReportView 都已经在可视化树中。

    我的解决方案是去掉 ContentControl 并在其位置声明 ReportView 控件。这样,Silverlight 将管理可视化树中的控件。

    (我最初使用动态方法,以便可以使用 MEF 通过 GetExportedValue 满足导入。当我发现 CompositionInitializer.SatisfyImports 时,我能够切换到在 XAML 中声明 ReportView。)

    【讨论】:

    • 奇怪的是我正在调用 listBox.Items.Clear() 来清除我将动态添加的控件的列表框。然后当我添加新控件时,在添加它之前,我添加了一行以从列表框中检索同名的控件。它找到了一个。然而在调试器中,itemcollection 是 0。我不明白它怎么能说 itemcollection 计数为零,但是如果我对对象中的控件进行显式“查找”,它会找到它。所以这就是发生这种情况的原因,它认为控件已经存在于我的项目集合中。
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2011-08-09
    相关资源
    最近更新 更多