2

我需要让 datagridcell 始终处于编辑模式。我没有找到任何选项来制作 datagrid 单元格编辑模式,所以我使用控件模板在 datagrid 单元格下使用了 TextBox。

我可以在文本框中书写,但数据网格单元格内容永远不会更新。如何用我在文本框中写的任何内容更新数据网格单元格内容?这是风格:

    <Style TargetType="{x:Type DataGridCell}" x:Key="DatagridCellWithTextbox">
            <Setter Property="BorderThickness" Value="2"></Setter>
            <Setter Property="Foreground" Value="{DynamicResource ContentNormalBrush}"/>
            <Setter Property="Margin" Value="0"></Setter>
            <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Grid Background="{TemplateBinding Background}">
                          <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <TextBox x:Name="txtCell" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}" VerticalContentAlignment="Top" Focusable="True" />
                          </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
          </Style>

谢谢迪

4

3 回答 3

3

您是否尝试过DataGridCell.IsEditing 属性

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="IsEditing" Value="True" />
</Style>

编辑:

您可以将DataGrid.CellEditEnding 事件中的编辑模式设置Cancel属性保持为.True

<DataGrid CellEditEnding="DataGrid_CellEditEnding"

.

private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    e.Cancel = true;
}
于 2012-05-17T22:13:48.350 回答
2

我知道这个问题很老,但我最近为此开发了自己的解决方案。

我所做的只是继承DataGridTextColumn并覆盖该GenerateElement方法:

public class EditingTextBoxColumn : DataGridTextColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var textbox = base.GenerateEditingElement(cell, dataItem) as TextBox;
        textbox.IsReadOnly = IsReadOnly;
        return textbox;
    }
}

这也适用于其他类型的列。当然,这只适用于DataGridColumn已经存在的类型(DataGridTextColumnDataGridComboBoxColumn)。

于 2016-11-18T08:50:00.113 回答
0

我知道这是旧的,但我想我有一个更好的答案。使用只读 DataGridTemplateColumn 并设置 CellTemplate。绑定在 CellTemplate 中无法正常工作,但您可以使用不同的 RelativeSource 来修复它:

<DataGridTemplateColumn Width="Auto" Header="Select" IsReadOnly="True">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate DataType="models:DealAcctListItem">
      <CheckBox IsChecked="{Binding RelativeSource=
                           {RelativeSource AncestorType=DataGridCell}, 
                           Path=DataContext.IsSelected}" />
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

这比试图让 DataGrid 的编辑模式正常工作要容易得多。

于 2020-07-08T08:41:39.580 回答