如何在嵌套在datagrid中的datagrid中单击复选框。

11 浏览
0 Comments

如何在嵌套在datagrid中的datagrid中单击复选框。

我已经搜索了很多次,但是没有找到解决方法...我认为这是因为我在中间嵌套了带有复选框的数据网格。现在我的应用程序需要点击两次才能改变复选框的选中状态。我猜第一次点击是为了获得适当行或单元格的焦点,第二次点击才会激活选中状态的改变。

这是我的XAML代码:


    
        
        
            
                
                    
                        
                    
                
            
            
                
                    
                        
                            
                        
                    
                
            
            
                
                    
                        
                            
                                
                                    
                                        
                                            
                                                
                                                    
                                                
                                            
                                            
                                        
                                    
                                
                            
                        
                    
                
            
        
    

我尝试设置样式:


    
    
    
    
    
    
    
    

不幸的是,我不再有相关事件的代码了。

我还尝试使用别人的自定义数据网格类的引用,链接如下:

https://stackoverflow.com/a/4827377/5807358

这个自定义类已经接近我想要的效果。事实上,它运行得很好...直到我需要取消选中内部数据网格中的复选框。没有办法在不先切换到主数据网格的另一行然后再切换回来的情况下改变已选框的状态。我试图进一步自定义这个类以获得我想要的结果,但是没有成功。

我还应该注意到,我尝试了上面链接中的每个解决方案。

有人以前遇到过这个问题吗?如果有人认为我的代码是相关的,我可以贴出我的代码。

谢谢

0
0 Comments

问题出现的原因是,当在DataGrid嵌套的DataGrid中单击复选框时,复选框不会被选中。解决方法是通过添加样式和事件处理程序来解决。

首先,在外层DataGrid的标签中添加以下样式:

    
        
    

然后,在代码中添加以下事件处理程序:

    void SelectRowDetailSection(object sender, MouseButtonEventArgs e)
    {
        var row = sender as DataGridRow;
        if (row != null)
        {
            row.Focusable = true;
            row.Focus();
            FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;
            TraversalRequest request = new TraversalRequest(focusDirection);
            UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
            if (elementWithFocus != null)
            {
                elementWithFocus.MoveFocus(request);
            }
        }
    }

需要注意的是,上面的样式需要添加在外层标签中,而不是部分。另外,可能还需要添加额外的样式来修复选中行时行标题消失的问题。这可能是由于使用mahapps.metro样式化窗口引起的,可能需要进一步调查。

0