使用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
。