问题以及解决------WPF DataGrid获得单元格的所在的具体行列数

2017-12-29 08:16:39来源:CSDN作者:cnyygydsk人点击

分享

        问题:做一个区域选择的功能,要求更够针对DataGrid中的某一行,勾选其中的几列(DataGridCheckBoxColumn),纠结在与如何获得具体的行数和列数,WPF中有Columns属性,但是没有单独的Rows属性



解决方法:利用可视化树的概念,以及ItemContainerGenerator.ContainerFromIndex(int)的方法,获取对应的单元格,详情见代码

//   从可视化树中获取到需要的子控件private T GetVisualChild<T>(DependencyObject parent) where T:Visual{    T child = default(T);     int numVisuals = VisualTreeHelper.GetChildrenCount(parent);    for(int i=0;i<numVisuals;i++)    {        Visual v = (Visual)VisualTreeHelper.GetChild(parent,i);         child = v as T;         if(child == null)              child = GetVisualChild<T>(v);          else             break;     }     return child;}

下面为获取某一行中,某一列的代码


int index = dataGrid.SelectedIndex;    //  获取当前选中行的索引DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow;   //  根据索引获得该行的DataGridRow对象DataGridCellsPresenter cells = GetVisualChild<DataGridCellsPresenter>(row);       //  根据可视化树取到改行中的所有列DataGridCell cell = (DataGridCell)cells.ItemContainerGenerator.ContainerFromIndex(int);   //   根据索引获取到具体单元格(cell.Content as CheckBox).IsChecked = true;


上面获取具体单元格的时候需要注意一点,那就是要确保数据已经绑定到界面上去了,不然会返回一个null,比如如果在Loaded事件的方法中要获取DataGridCell时,是取不到值的,因为数据还没有真正和控件结合起来,所以获取Container是不会有值的,解决方法为先让DataGrid调用一遍UpdateLayout方法



最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台