类中存储Control并绑定复用:GridView复用NumberBox抛COM异常
GridView复用NumberBox控件时触发"未检测到已安装组件"异常
我尝试在GridView中复用NumberBox控件,因为直接将NumberBox嵌入GridView的数据模板会引发异常行为,复用则能避免该问题,但现在持续遇到报错:在代码行(templateRoot.FindName("NumberBox") as GridViewItem).Content = item.NumberBox;处抛出**"未检测到已安装组件"**的错误,这段代码位于UpdateGridViewContainer回调方法中:
/// <summary> /// 更新名为CardGridView的GridView容器的回调方法 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void UpdateGridViewContainer(ListViewBase sender, ContainerContentChangingEventArgs args) { if (args.Phase == 1) { Grid templateRoot = args.ItemContainer.ContentTemplateRoot as Grid; CardItem item = args.Item as CardItem; (templateRoot.FindName("NumberBox") as GridViewItem).Content = item.NumberBox; TypedEventHandler<NumberBox, NumberBoxValueChangedEventArgs> handler = (box, args) => { if (!double.IsNaN(args.NewValue)) { _viewModel.ChangeCount(args, item); } }; item.SetHandler(handler); } }
该异常会在包含该GridView的页面离开后重新导航时触发。我尝试在页面离开时清空NumberBox,但问题依然存在,清空代码如下:
/// <summary> /// 页面重新加载时创建新的NumberBox /// </summary> private void ResetNumberBoxes() { foreach (CardItem card in CardGridView.Items.Cast<CardItem>()) { card.ResetNumberBox(); } CardGridView.ItemsSource = null; CardGridView.Items.Clear(); }
其中ResetNumberBox方法仅将原有NumberBox设为null,然后重新赋值新实例。
异常详情
System.Runtime.InteropServices.COMException HResult=0x800F1000 Message=No installed components were detected. (0x800F1000) Source=WinRT.Runtime StackTrace: at WinRT.ExceptionHelpers.<ThrowExceptionForHR>g__Throw|20_0(Int32 hr) at ABI.Microsoft.UI.Xaml.Controls.IContentControlMethods.set_Content(IObjectReference _obj, Object value)
更新尝试
我已从DataTemplate中移除GridViewItem控件,尝试以下代码,但结果依旧抛出相同异常:
CardItem item = args.Item as CardItem; Grid.SetColumn(item.NumberBox, 1); item.NumberBox.HorizontalAlignment = HorizontalAlignment.Center; item.NumberBox.VerticalAlignment = VerticalAlignment.Center; (templateRoot.FindName("GridViewTemplate") as Grid).Children.Add(item.NumberBox);
另外,我在抛出异常的代码行前检查了堆转储,确认仅存在一个Grid实例,且NumberBox的Parent属性为null。
内容的提问来源于stack exchange,提问作者John Glen
相关产品推荐
相关产品推荐

