gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:10:26 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com