之前做項目中遇到使用DataGrid,對DataGrid中某一個單元格進行編輯並保存,其中在得到DataGrid某個單元格中的值遇到問題,在網上查找各種資料后終於解決問題,下面把代碼貼出來和大家分享一下。
如下圖,對DataGrid中的編號和是否啟用編輯后,得到單元格修改后的數據,並對修改后的數據進行保存。我剛開始的思路是:將數據源綁定到前台頁面上,然后使用DataGrid自帶的一個屬性,將IsReadOnly屬性設置為False后,就可以對頁面上的數據進行編輯了,但是出現一個問題是,在得到DataGrid中某個單元格的數據時,得到的只是綁定之前的數據,得不到修改后的數據。百思不得其解,最后變換思路,首先得到DataGrid的一個單元格,由於DataGrid中的一個單元格是模板構成的,所以就要先得到這個單元格的模板。
前台XAML代碼:其中編號和是否啟用使用了模板
<DataGrid Name="dgList" Margin="0,12,0,0" AutoGenerateColumns="False" IsReadOnly="True" MouseRightButtonDown="dgList_MouseRightButtonDown"> <DataGrid.Columns> <DataGridTextColumn Header="城市" Width="150" Binding="{Binding Path=Name}"/> <DataGridTemplateColumn Header="編號" Width="150" > <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Height="20" Width="120" Text="{Binding Path=No}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="是否啟用"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox Height="20" Padding="0,3,0,0" Width="120" IsChecked="{Binding Path=IsUse}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
后台核心代碼:
此方法是得到DataGrid單元格中的可視化子項
public static T GetVisualChild<T>(Visual parent) where T : Visual { T childContent = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); childContent = v as T; if (childContent == null) { childContent = GetVisualChild<T>(v); } if (childContent != null) { break; } } return childContent; } /// <summary> /// 得到DataGrid的一個單元格 /// </summary> /// <param name="rowIndex">行索引</param> /// <param name="cellIndex">列索引</param> /// <returns></returns> private DataGridCell GetDataGridCell(int rowIndex, int cellIndex) { DataGridRow row = (DataGridRow)dgList.ItemContainerGenerator.ContainerFromIndex(rowIndex); dgList.UpdateLayout(); row = (DataGridRow)dgList.ItemContainerGenerator.ContainerFromIndex(rowIndex); DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row); DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(cellIndex); dgList.ScrollIntoView(row, dgList.Columns[cellIndex]); cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(cellIndex); return cell; } /// <summary> /// 得到TextBox里的值 /// </summary> /// <param name="rowIndex">行索引</param> /// <param name="cellIndex">列索引</param> /// <returns>TextBox里的值</returns> private string GetTextBoxValue(int rowIndex, int cellIndex) { var obj = VisualTreeHelper.GetChild((ContentPresenter)GetDataGridCell(rowIndex, cellIndex).Content, 0); TextBox tbox = null; if (obj != null && obj.DependencyObjectType.Name == "TextBox") { tbox = (TextBox)obj; } return tbox.Text; } /// <summary> /// 得到CheckBox里的值 /// </summary> /// <param name="rowIndex">行索引</param> /// <param name="cellIndex">列索引</param> /// <returns>CheckBox里的值</returns> private string GetCheckBoxValue(int rowIndex, int cellIndex) { var obj = VisualTreeHelper.GetChild((ContentPresenter)GetDataGridCell(rowIndex, cellIndex).Content, 0); CheckBox chk = null; if (obj != null && obj.DependencyObjectType.Name == "CheckBox") { chk = (CheckBox)obj; } return chk.IsChecked.ToString(); }
沒有修改之前的數據:
修改之后的數據: