C# FindParent<;T>;使用WPFToolkit:Datagrid时为null

C# FindParent<;T>;使用WPFToolkit:Datagrid时为null,c#,wpf,xaml,C#,Wpf,Xaml,当我使用xaml代码时 <DataGrid Name="DataGrid1" ItemsSource="{Binding Path=MainSearchBinding}" HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended" CanUserAddRows="False" CanUserDeleteRows="False" CanUs

当我使用xaml代码时

<DataGrid Name="DataGrid1" 
          ItemsSource="{Binding Path=MainSearchBinding}"  
          HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
          CanUserAddRows="False" CanUserDeleteRows="False"
          CanUserResizeRows="False" CanUserSortColumns="True"
          AutoGenerateColumns="False" IsTextSearchEnabled="True" IsReadOnly="True" 
          RowHeaderWidth="17" SelectionChanged="DataGrid1_SelectionChanged"
          MouseDoubleClick="OnDoubleClick" MouseLeftButtonUp="OnMouseClick">

工作正常。
切换到
时:


我有个错误:

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

使用此行中的
FindParent(…)

DependencyObject parentObject = VisualTreeHelper.GetParent(child);

public static T FindParent<T>(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<T>(parentObject);
    }
}
DependencyObject parentObject=VisualTreeHelper.GetParent(子级);
公共静态T FindParent(此DependencyObject子级)
其中T:DependencyObject
{
//获取父项
DependencyObject parentObject=VisualTreeHelper.GetParent(子级);
//我们已经到了树的尽头
if(parentObject==null)返回null;
//检查父项是否与我们要查找的类型匹配
var parent=parentObject作为T;
如果(父项!=null)
{
返回父母;
}
其他的
{
返回FindParent(parentObject);
}
}
我的密码在这里。如果您单击datagrid单元格,它将打开新选项卡

var tabControl = (sender as DataGrid).FindParent<TabControl>();
tabControl.Items.Add(new TabItem() { Header = "Документ", Content = docview, IsSelected = true });
var tabControl=(发送方为DataGrid).FindParent();
tabControl.Items.Add(新的TabItem(){Header=“ББimk_Мц”,Content=docview,IsSelected=true});

我知道我错过了什么,请告诉我该去哪里?提前感谢。

从外观上看,您的错误将来自以下行:

DependencyObject parentObject = VisualTreeHelper.GetParent(child);
因为
child
null
。您正试图将
发送方
强制转换为
数据网格
,这就是它第一次工作的原因,因为您使用的是
数据网格
。但是第二次,我假设您使用的是不同的
DataGrid
(可能是定制的);因此,强制转换将返回
null
。因此,在调用
FindParent(…)
时,
child
将为
null


获取错误时,请查看堆栈跟踪并查看错误的来源。它应该向您显示准确的行,并且在使用调试器查看时,您应该能够看到哪个值是
null

这里的问题在这一行:

var tabControl = (sender as DataGrid).FindParent<TabControl>();

相反。

我的问题是,当我使用自定义数据网格时,为什么它返回null?所以这让我发疯了。也许问题出在FindParent。你认为呢?你想把发送者转换到哪个数据网格?如果是System.Windows.Controls.DataGrid,则强制转换将返回null,除非WpfToolkit.DataGrid派生自该类。但我相信它们是独立的实现(WpfToolkit.DataGrid是wpf4datagrid的前身),这意味着不能在两者之间强制转换。为什么要尝试转换到DataGrid?只需强制转换为DependencyObject。如何强制转换DependencyObject?我尝试了这段代码,但对var tabControl=(发送方作为DependencyObject)没有帮助;请帮助。var tabControl=(发件人为Microsoft.Windows.Controls.DataGrid)。FindParent();我试过了,谢谢你的贡献。嗨,卢克,首先感谢你抽出时间来帮助我。你写信给我的时候我就试过了。它给出了相同的错误:ArgumentNUllException已处理。值不能为null,参数名称:element。显示此行DependencyObject parentObject=VisualTreeHelper.GetParent(子级);var tabControl=(发送方作为DependencyObject).FindParent()@FirdavsKurbonov:我有点困惑,因为你添加了一条评论说我建议的修复方案不起作用,但你后来接受了我的回答。它是否有效?var tabControl=(发件人为Microsoft.Windows.Controls.DataGrid)。FindParent();我做了这件事,它起了作用,你的暗示对我帮助很大。谢谢
var tabControl = (sender as DataGrid).FindParent<TabControl>();
var tabControl = (sender as DependencyObject).FindParent<TabControl>();