选择RowDetailsTemplate内的WPF DataGrid的单元格

时间:2010-12-07 13:09:39

标签: c# .net wpf datagrid

当我将第二个数据网格作为rowdetailstemplate时,我在数据网格中遇到了一些奇怪的行为。主数据网格绑定到我的项目集合,详细信息datagrid绑定到项目包含的子项集合。现在所有这些都完美呈现,但是当我想直接单击SubItemsGrid中的单元格时,它首先选择包含SubItemsGrid的主网格中该行的第一个单元格。我必须再次点击才能进入我想要选择的单元格。

有没有人对此进行过分析?如果是这样,是否有解决方法?

这是我的标记(部分):

<DataGrid x:Name="ItemGrid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" SelectionUnit="Cell"
          RowDetailsVisibilityMode="Visible" CanUserResizeRows="False" AreRowDetailsFrozen="False" VerticalAlignment="Top"
          CanUserAddRows="False" CanUserDeleteRows="False" VerticalScrollBarVisibility="Hidden">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Column1" Binding="{Binding Path=ID}" Width="350"/>
        <DataGridTextColumn Header="Column2" Binding="{Binding Path=Name}" Width="80"/>
        <DataGridTextColumn Header="Column3" Binding="{Binding Path=Description}" Width="80"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid x:Name="SubItemsGrid" ItemsSource="{Binding Path=SubItems}" AutoGenerateColumns="False"
                      SelectionUnit="Cell" HeadersVisibility="None" Margin="50,0,0,0" VerticalAlignment="Top" CanUserAddRows="False" 
                      CanUserResizeRows="False" CanUserDeleteRows="False" BorderThickness="0">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column1" Binding="{Binding Path=Name}" Width="300" />
                    <DataGridTextColumn Header="Column2" Binding="{Binding Path=Description}" Width="80"/>
                    <!-- Etc.--> 

--- --- EDIT

好的,我提出了在SubItemsGrid上处理鼠标添加事件的想法,然后在代码中将焦点设置为SubItemsGrid,如下所示:

private void SubItemsGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
   DataGrid selectedGrid = sender as DataGrid;
   if (selectedGrid != null)
   {
       selectedGrid.Focus()
   }
}

调试显示在正确的网格上调用'Focus'方法,但我没有得到任何视觉效果。我觉得我非常接近解决方案。任何人吗?

1 个答案:

答案 0 :(得分:0)

我通过捕获SubItemsGrid的'SelectedCellsChanged'事件来解决这个问题。在处理程序中,我在引发事件的网格上调用了“BeginEdit()”。这确实将焦点直接放在单击的单元格上,但也将单元格置于编辑模式。这就是我之后直接调用CancelEdit()的原因。这将使焦点集中在单元格上,但不会处于编辑模式。

private void SubItemsGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
   DataGrid selectedGrid = sender as DataGrid;
   if (selectedGrid != null)
   {
       selectedGrid.BeginEdit();
       selectedGrid.CancelEdit();
   }
}