从WPF DataGridRow获取项目

时间:2014-08-21 08:26:26

标签: c# wpf datagrid

当鼠标离开行时,我有一个鼠标离开事件

<DataGrid.RowStyle>
     <Style TargetType="DataGridRow">
           <EventSetter Event="MouseLeave" Handler="Row_MouseLeave"></EventSetter>
     </Style>
</DataGrid.RowStyle>

所以在处理程序中,我尝试获取与行绑定的下划线项

private void Row_MouseLeave(object sender, MouseEventArgs args)
{
   DataGridRow dgr = sender as DataGridRow;

   <T> = dgr.Item as <T>;
}

但是,该项目是占位符对象,而不是项目本身。

通常,您可以通过DataGrid selectedIndex属性执行我想要的操作。

 DataGridRow dgr = (DataGridRow)(dg.ItemContainerGenerator.ContainerFromIndex(dg.SelectedIndex));

 <T> = dgr.Item as <T>

但由于ItemSource与DataGrid绑定,而不是DataGridRow,因此DataGridRow无法看到绑定到网格的集合...(我假设)

但是因为我没有选择一行,所以我真的不能这样做。那么我有办法做我想做的事吗?

干杯

1 个答案:

答案 0 :(得分:3)

如果您将事件处理程序附加到DataGridRow.MouseLeave事件,那么sender输入参数将是DataGridRow,正如您正确向我们展示的那样。然而,在那之后你错了。 DataGridRow.Item属性DataGridRow 中返回数据项,除非您将鼠标悬停在DataGrid <中的最后一行(空行或新行)上/ em> ...在这种情况下,只有那个案例,DataGridRow.Item属性将返回{NewItemPlaceholder}类型MS.Internal.NamedObject

private void Row_MouseLeave(object sender, MouseEventArgs args)
{
    DataGridRow dataGridRow = sender as DataGridRow;
    if (dataGridRow.Item is YourClass)
    {
        YourClass yourItem = dataGridRow.Item as YourClass;
    }
    else if (dataGridRow.Item is MS.Internal.NamedObject)
    {
        // Item is new placeholder
    }
}

尝试将鼠标悬停在实际包含数据的行上,然后您应该在DataGridRow.Item属性中找到该数据对象。