【问题标题】:WPF dataGgridCell Edit ModeWPF dataGgridCell 编辑模式
【发布时间】:2012-05-17 15:19:28
【问题描述】:

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

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

    <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>

谢谢 深

【问题讨论】:

    标签: wpf datagridcell editmode


    【解决方案1】:

    你试过DataGridCell.IsEditing Property吗?

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

    编辑:

    您可以将DataGrid.CellEditEnding Event 中的Cancel 属性设置为True

    <DataGrid CellEditEnding="DataGrid_CellEditEnding"
    

    .

    private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        e.Cancel = true;
    }
    

    【讨论】:

    • 我试过了,但是当我完成编辑后,它又回到了非编辑模式。我想让它始终处于编辑模式
    • 首先我认为它会恢复样式设置器,也许它甚至可以使用样式触发器来完成,因为触发器总是正确的,但最好在我的编辑中尝试我的新建议。
    【解决方案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 等...)。

    【讨论】:

      【解决方案3】:

      我知道这是旧的,但我想我有一个更好的答案。使用只读 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 的编辑模式正常工作要容易得多。

      【讨论】:

      • 感谢 Chris 就这么老的问题发布了这个出色的更新。它确实帮助了我们。您的 2020 年解决方案比其他解决方案要好得多。让我奖励你一些额外的分数。干得好。
      • @ThomasWeller 非常好的举动!
      猜你喜欢
      • 2011-04-30
      • 2013-02-08
      • 2014-03-26
      • 2011-10-19
      • 2021-02-22
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多