C# FindParent<;T>;使用WPFToolkit:Datagrid时为null
当我使用xaml代码时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
<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>();