wpf - WPF DataGridTemplateColumn。我想念什么吗?

标签 wpf datagrid focus wpfdatagrid wpftoolkit

     <data:DataGridTemplateColumn Header="Name">
        <data:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}">
            </DataTemplate>
        </data:DataGridTemplateColumn.CellTemplate> 
        <data:DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Name}">
            </DataTemplate>
        </data:DataGridTemplateColumn.CellEditingTemplate> 
    </data:DataGridTemplateColumn>              

这是"template"列的明确示例,对吧?这可能是什么问题?
因此,这就是事情-当用户按下TAB键浏览DataGrid时,它需要两次按下TAB(!)才能在TextBox中编辑文本。我指的是,即使他只是开始输入,我如何才能使它变为可编辑状态?

好的。我找到了一种方法-在Grid.KeyUp()中,将下面的代码放入其中:
 if (Grid.CurrentColumn.Header.ToString() == "UserName")
        {
            if (e.Key != Key.Escape) 
            {
                Grid.BeginEdit();

                // Simply send another TAB press
                if (Keyboard.FocusedElement is Microsoft.Windows.Controls.DataGridCell)
                {
                    var keyEvt = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab) { RoutedEvent = Keyboard.KeyDownEvent };
                    InputManager.Current.ProcessInput(keyEvt);
                }
            }
        } 

最佳答案

您的问题源于以下事实:每个单元格都将其编辑器置于内容控件中,该控件首先获得焦点,然后您必须再次按Tab键进入编辑器。如果您查看GenerateEditingElement方法中DataGridTemplateColumn的代码,它将调用方法LoadTemplateContent来执行此操作:

private FrameworkElement LoadTemplateContent(bool isEditing, object dataItem, DataGridCell cell)
{
    DataTemplate template = ChooseCellTemplate(isEditing);
    DataTemplateSelector templateSelector = ChooseCellTemplateSelector(isEditing);
    if (template != null || templateSelector != null)
    {
        ContentPresenter contentPresenter = new ContentPresenter();
        BindingOperations.SetBinding(contentPresenter, ContentPresenter.ContentProperty, new Binding());
        contentPresenter.ContentTemplate = template;
        contentPresenter.ContentTemplateSelector = templateSelector;
        return contentPresenter;
    }

    return null;
}

看看它是如何创建一个新的内容演示者来放置模板的。其他人已经以各种方式处理了这个问题,我派生了自己的列类型来处理这些问题。 (因此,我不会创建额外的元素或将内容演示者设置为不接收焦点)在此example中,他们使用焦点管理器来处理相同的问题(我尚未测试此代码)
<tk:DataGridTemplateColumn.CellEditingTemplate>
   <DataTemplate>
      <Grid FocusManager.FocusedElement="{Binding ElementName=txt1}">
         <TextBox Name="txt1" Text="{Binding XPath=@ISBN}" 
                  BorderThickness="0" GotFocus="TextBox_GotFocus"/>
      </Grid>
   </DataTemplate>
</tk:DataGridTemplateColumn.CellEditingTemplate>

如果您有用户控件作为编辑器,则可以将模式与焦点管理器一起使用,或将事件处理程序用于OnLoaded事件。

关于wpf - WPF DataGridTemplateColumn。我想念什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104164/

相关文章:

javascript - HTML 如果我按 Tab 键,焦点接下来会去哪里?

Java 阻止最后一个 JFrame 像 JOptionPane 一样被聚焦

wpf - 如何更改DocumentViewer的查看模式

c# - 将 CustomControl 绑定(bind)到自己的属性

javascript - 从 iframe 中移除焦点?

c# - 如何在 DataGrid 中隐藏自动生成的列?

asp.net: 子控件的 Visible 属性什么时候自动设置?

c# - 在 Show() 之前获取窗口的大小

c# - WPF Image : . Source = Clipboard.GetImage() 未显示

wpf - WPF DataGrid 中的验证不起作用