gpt4 book ai didi

c# - 在 DataGrid wpf 中创建自定义编辑行

转载 作者:行者123 更新时间:2023-12-04 01:57:06 25 4
gpt4 key购买 nike

默认情况下,双击一个单元格会将其转换为编辑模式,当它失去焦点时,它将提交数据或回滚(如果我们按 ESC)。

我想创建一个自定义按钮来将一行中的所有单元格切换到编辑模式,一个按钮用于提交更改,一个按钮用于取消更改。

此功能是否已被 Datagrid 支持,还是我必须自己实现所有逻辑?

我找到了一种将一行的所有单元格切换到编辑模式的方法,但是每次文本框失去焦点时,它都会关闭编辑模式

我该如何防止这种情况发生?以及如何制作确定按钮以提交所有数据?

最佳答案

使用DataGrid.BeginEdit()/CancelEdit()/CommitEdit()方法。

关于编辑有一些事件需要处理:BeginningEdit , CellEditEnding , PreparingCellForEdit .

使用 DataGridCell.IsEditing 属性打开/关闭编辑模式。

您可以获得DataGridRow,您可以从中循环遍历它的DataGridCell。有很多这方面的教程。

满足您特定需求的确切方法:1. 为所有列创建 2 个模板。

  1. 并将 CellTemplate 更改为可编辑列的 CellEditingTemplate

  2. 并在取消/提交后再次将 CellTemplate 更改为旧的 CellTemplate

    <DataGrid x:Name="DGrid" SelectionUnit="FullRow" AutoGenerateColumns="False" ItemsSource="{Binding Students}" Height="400" CanUserAddRows="False" Margin="10,10,405,18">

    <DataGrid.Columns>
    <DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <StackPanel Width="100">
    <Button Content="Edit" Click="Button_Click_1"/>
    </StackPanel>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
    <StackPanel Orientation="Horizontal" Width="100">
    <Button Content="Cancel" Click="Button_Click_2"/>
    <Button Content="Commit" Click="Button_Click_3"/>
    </StackPanel>
    </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
    <TextBox Background="Aquamarine" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
    </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>

    </DataGrid.Columns>

代码隐藏

        // Edit
private void Button_Click_1(object sender, RoutedEventArgs e)
{
DataGridRow row = (DataGridRow)DGrid.ItemContainerGenerator.ContainerFromItem(DGrid.CurrentItem);
_showCellsEditingTemplate(row);
}

// Cancel
private void Button_Click_2(object sender, RoutedEventArgs e)
{
DataGridRow row = (DataGridRow)DGrid.ItemContainerGenerator.ContainerFromItem(DGrid.CurrentItem);
_showCellsNormalTemplate(row);
}

// Commit
private void Button_Click_3(object sender, RoutedEventArgs e)
{
DataGridRow row = (DataGridRow)DGrid.ItemContainerGenerator.ContainerFromItem(DGrid.CurrentItem);
_showCellsNormalTemplate(row, true);
}

private void _showCellsEditingTemplate(DataGridRow row)
{
foreach (DataGridColumn col in DGrid.Columns)
{
DependencyObject parent = VisualTreeHelper.GetParent(col.GetCellContent(row));
while (parent.GetType().Name != "DataGridCell")
parent = VisualTreeHelper.GetParent(parent);

DataGridCell cell = ((DataGridCell)parent);
DataGridTemplateColumn c = (DataGridTemplateColumn)col;
if(c.CellEditingTemplate !=null)
cell.Content = ((DataGridTemplateColumn)col).CellEditingTemplate.LoadContent();
}
}

private void _showCellsNormalTemplate(DataGridRow row, bool canCommit = false)
{
foreach (DataGridColumn col in DGrid.Columns)
{
DependencyObject parent = VisualTreeHelper.GetParent(col.GetCellContent(row));
while (parent.GetType().Name != "DataGridCell")
parent = VisualTreeHelper.GetParent(parent);

DataGridCell cell = ((DataGridCell)parent);
DataGridTemplateColumn c = (DataGridTemplateColumn)col;
if (col.DisplayIndex != 0)
{
if (canCommit == true)
((TextBox)cell.Content).GetBindingExpression(TextBox.TextProperty).UpdateSource();
else
((TextBox)cell.Content).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}
cell.Content = c.CellTemplate.LoadContent();
}
}



public class ViewModel
{
ObservableCollection<Student> _students = new ObservableCollection<Student>();
public ObservableCollection<Student> Students
{ get { return _students; } set { _students = value; } }

public ViewModel()
{
Students.Add(new Student() { Name = "Prashant", Address = "123, N2 B, Barkheda" });
Students.Add(new Student() { Name = "Amit", Address = "123, N2 B, Piplani" });
Students.Add(new Student() { Name = "Gopi", Address = "Subhash Nagar" });
Students.Add(new Student() { Name = "S. Sachin", Address = "HabibGanj" });
}
}

public class Student
{
public string Name { get; set; }
public string Address { get; set; }
}

关于c# - 在 DataGrid wpf 中创建自定义编辑行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34988049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com