【问题标题】:Edit behaviour of DataGridTemplateColumn编辑 DataGridTemplateColumn 的行为
【发布时间】:2017-06-01 11:23:57
【问题描述】:

我的DataGrid 有几个DataGridTemplateColumn 是这样的:

 <local:DataGridSyntaxColumn MinWidth="100" x:Name="cVariantNew1" Width="250">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <local:SyntaxTextBlock HorizontalAlignment="Left" SyntaxType="VARIANT" Value="{Binding Variants[0].Name, Mode=OneWay}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Variants[0].Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"  Style="{StaticResource GridTextBox}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
</local:DataGridSyntaxColumn>

DataGridSyntaxColumn 只是为了设置焦点:

 public class DataGridSyntaxColumn : DataGridTemplateColumn
    {
        protected override object PrepareCellForEdit(FrameworkElement editingElement,
                                                RoutedEventArgs editingEventArgs)
        {
            editingElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
            return base.PrepareCellForEdit(editingElement, editingEventArgs);
        }
    }

这工作正常,但编辑模式不像通常的DataGridTextColumn

例如:

  • DataGridTextColumn 中,双击会将光标设置到单击的位置,或者如果在空白处单击,则会选择单元格的全部内容
  • 开始输入不进入编辑模式

有没有办法实现完全相同的行为?

【问题讨论】:

  • 您是否尝试从 DataGridTextColumn 继承并简单地覆盖 GenerateElement 方法?
  • 什么是 GenerateElement 方法?我需要 SyntaxTextBlock 来显示 SyntaxHighlighting
  • 请参考我的回答。从 DataGridTextColumn 而不是 DataGridTemplateColumn 继承 DataGridSyntaxColumn 类。

标签: c# wpf datagrid datagridtemplatecolumn datagridtextcolumn


【解决方案1】:

您可以尝试从DataGridTextColumn 继承并简单地覆盖GenerateElement 方法:

public class DataGridSyntaxColumn : DataGridTextColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        SyntaxTextBlock textBlock = new SyntaxTextBlock()
        {
            HorizontalAlignment = HorizontalAlignment.Left,
            SyntaxType = VARIANT
        };

        BindingBase binding = Binding;
        if (binding != null)
            BindingOperations.SetBinding(textBlock, TextBlock.TextProperty, binding);
        else
            BindingOperations.ClearBinding(textBlock, TextBlock.TextProperty);

        return textBlock;
    }
}

<local:DataGridSyntaxColumn MinWidth="100" Binding="{Binding Variants[0].Name}"  Width="250" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多