Вы можете помещать только одну ячейку в режим редактирования за раз независимо от того, что свойство DataGrid IsReadOnly
имеет значение True или False.
Если вы хотите разрешить пользователям редактировать ячейки указанного c в строке после нажатия кнопки «Изменить» вы можете обратиться к приведенному ниже коду:
XAML:
<DataGrid x:Name="MyDataGrid" SelectionMode="Single" IsReadOnly="True" AutoGenerateColumns="False" Margin="0,25,0,0"
SelectedCellsChanged="MyDataGrid_SelectedCellsChanged" SelectionUnit="Cell">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Edit">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="btnEdit" Content="Edit" Click="btnEdit_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="ID" Visibility="Collapsed" Binding="{Binding CustomerId}" />
<DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" />
<DataGridTextColumn Header="LastName" Binding="{Binding LastName}" />
</DataGrid.Columns>
</DataGrid>
Код позади:
private Customer _editableCustomer;
private void btnEdit_Click(object sender, RoutedEventArgs e)
{
_editableCustomer = (Customer)MyDataGrid.SelectedCells.First().Item;
}
private void MyDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
if (e.AddedCells.First().Item == _editableCustomer)
GetDataGridCell(MyDataGrid.SelectedCells.First()).IsEditing = true;
}
public static DataGridCell GetDataGridCell(DataGridCellInfo cellInfo)
{
var cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
if (cellContent != null)
return (DataGridCell)cellContent.Parent;
return null;
}
Однако лично я не стал бы этого делать. Я бы установил для свойства DataGrid IsReadOnly
значение False и добавил бы обработчик событий для события BeginningEdit
DataGrid. Тогда я мог бы делать все, что захочу, в обработчике событий до того, как пользователь редактирует строки.