使用WPFToolkit:Datagrid时,FindParent 为null

当我使用xaml代码时。

 

它工作正常。
切换到

  

我有错误:

“值不能为null。参数名称:element”

使用此行中的FindParent(...)

 DependencyObject parentObject = VisualTreeHelper.GetParent(child); public static T FindParent(this DependencyObject child) where T : DependencyObject { //get parent item DependencyObject parentObject = VisualTreeHelper.GetParent(child); //we've reached the end of the tree if (parentObject == null) return null; //check if the parent matches the type we're looking for var parent = parentObject as T; if (parent != null) { return parent; } else { return FindParent(parentObject); } } 

我的代码在这里。 如果单击datagrid单元格,它将打开新选项卡。

 var tabControl = (sender as DataGrid).FindParent(); tabControl.Items.Add(new TabItem() { Header = "Документ", Content = docview, IsSelected = true }); 

我知道我遗失了什么,请告诉我搬家的地方? 提前致谢。

问题出在这一行:

 var tabControl = (sender as DataGrid).FindParent(); 

WPF Toolkit DataGrid具有类Microsoft.Windows.Controls.DataGrid ,而内置的WPF DataGrid具有类System.Windows.Controls.DataGrid 。 如果您的sender对象是WPF Toolkit DataGrid,并且上面代码行中的DataGrid是内置的WPF DataGrid,那么sender as DataGrid将为null。 WPF Toolkit DataGrid与内置DataGrid完全分离,特别是不从它inheritance。

幸运的是,这个问题很容易解决。 您不需要将sender转换为DataGrid类。 您的FindParent扩展方法适用于DependencyObject ,并且两个DataGrid类都inheritance自DependencyObject ,因此您可以编写

 var tabControl = (sender as DependencyObject).FindParent(); 

代替。

从它的外观来看,你的错误将来自这条线:

 DependencyObject parentObject = VisualTreeHelper.GetParent(child); 

因为child将为null 。 您正在尝试将sender转换为DataGrid ,这就是它第一次工作的原因,因为您使用的是DataGrid 。 但第二次,我假设您正在使用不同的DataGrid (可能是自定义DataGrid ); 所以演员表将返回null 。 因此,当调用FindParent(...)child将为null

获取错误时,请查看堆栈跟踪并查看错误源自何处。 它应该显示确切的行,当使用调试器查看时,您应该能够看到哪个值为null