WPF DataGrid - Как сделать выбранную строку доступной для редактирования при нажатии кнопки - PullRequest
0 голосов
/ 07 мая 2020

Для следующего DataGrid задано значение ReadOnly. Но при нажатии Edit Button в строке мне нужно, чтобы эта строка стала редактируемой. Как мы можем достичь этой задачи?

Обратите внимание, что событие нажатия кнопки «Изменить» по-прежнему запускается в сетке ReadOnly. Возможно, в этом случае нам нужно установить для свойства DataGridCell.IsEditing значение true для каждой ячейки в этой строке. Но я не могу получить DataGridCell object в строке. Или могут быть другие варианты получше.

<Window x:Class="MyTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        .....
        Title="MainWindow">
    <Grid>
        <DataGrid x:Name="MyDatagrid" IsReadOnly="True" AutoGenerateColumns="False" SelectionMode="Single">
            <DataGrid.Columns>
               <DataGridTemplateColumn Header="Edit">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button x:Name="btnEdit" Content="Edit" Click="btnEdit_Click"></Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
               </DataGridTemplateColumn>
                <DataGridTextColumn Header="ID" Visibility="Collapsed" Binding="{Binding MyClassId}" />
                <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
                <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

MyClass и другой соответствующий код :

public class MyClass
{
    [Key]
    public int MyClassId { get; set; }
    public string FirstName{ get; set; }
    public string LastName{ get; set; }
    .........
    .........
}

//DataGrid binding to source:
List<MyClass> lstMyClass = db.MyClass.ToList();
MyDatagrid.ItemsSource = lstMyClass;
............
.........

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Задайте для свойства CurrentCell значение DataGridCellInfo и вызовите BeginEdit(), если вы хотите войти в режим редактирования программно:

private void btnEdit_Click(object sender, RoutedEventArgs e)
{
    MyDatagrid.IsReadOnly = false;
    MyDatagrid.CurrentCell = new DataGridCellInfo((sender as Button).DataContext, dataGrid.Columns[0]);
    MyDatagrid.BeginEdit();
}

Обратите внимание, что вы должны установить IsReadOnly на false чтобы иметь возможность войти в режим редактирования. Вы не можете редактировать DataGrid только для чтения. Вы можете вернуть его в true в обработчике событий CellEditEnding.

0 голосов
/ 07 мая 2020
 <DataGrid x:Name="MyDatagrid" AutoGenerateColumns="False" SelectionMode="Single">
        <DataGrid.Columns>
           <DataGridTemplateColumn Header="Edit">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ToggleButton x:Name="btnEdit" Content="Edit" IsChecked="{Binding Is_Checked}"></ToggleButton>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
           </DataGridTemplateColumn>
            <DataGridTextColumn Header="ID" Visibility="Collapsed" Binding="{Binding MyClassId}" />
            <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" IsReadOnly="{Binding Is_Checked}"/>
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" IsReadOnly="{Binding Is_Checked}"/>
        </DataGrid.Columns>
    </DataGrid>

Во-первых, каждый столбец должен иметь IsReadOnly.

И IsReadOnly, привязка Is_Checked MyClass.

IsChecked ToggleButton Связывание Is_Checked MyClass тоже.

Затем, когда ToggleButton Нажмите, измените IsReadOnly столбца.

Все это должно быть MVVM

public class MyClass
{
    [Key]
    public int MyClassId { get; set; }
    public string FirstName{ get; set; }
    public string LastName{ get; set; }
    public bool Is_Checked{ get; set; }
    .........
    .........
}
...