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