假设我有一个DataGrid。假设所有列都是TemplateColumns。当任何单元格获得焦点时,我希望它进入EditMode。
到目前为止我尝试了什么:
我为DataGridCell创建了一个样式,如下所示:
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus" />
</Style>
在窗口的代码背后:
private void DataGridCell_GotFocus(object sender, RoutedEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
{
cell.IsEditing = true;
}
}
以上问题尝试:
我必须单击单元格才能将其置于编辑模式。
答案 0 :(得分:3)
在焦点上,单元格进入编辑模式,但textBox没有键盘焦点,因此下一个标签按下将被textBox 占用,并将获得焦点。
正如您所提到的,您必须按两次 Tab 才能将焦点移至下一个单元格。您可以做的是将重点放在已加载事件上的TextBox :
虚拟元素的XAML :
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Name}" Loaded="TextBox_Loaded"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
背后的代码:
private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
(sender as TextBox).Focus();
}
当然,您可以将处理程序移动到dataGrid中所有TextBox的基本样式,这样您就不必为所有单元格挂钩处理程序。
如果您不想拥有处理程序,也可以使用 interactivity
触发器执行此操作,例如定义here:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Name}">
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="Loaded">
<local:TakeFocusAction />
</Interactivity:EventTrigger>
</Interactivity:Interaction.Triggers>
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
和行为触发操作:
public class TakeFocusAction : TriggerAction<UIElement>
{
protected override void Invoke(object parameter)
{
AssociatedObject.Focus();
}
}
答案 1 :(得分:0)
这是一个让它可编辑的技巧
BeginEdit()
方法将当前单元格置于编辑模式。
样品
private void DataGridCell_GotFocus(object sender, RoutedEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
{
var parent = VisualTreeHelper.GetParent(cell);
while (parent != null && parent.GetType() != typeof(DataGrid))
{
parent = VisualTreeHelper.GetParent(parent);
}
DataGrid dGrid = parent as DataGrid;
dGrid.BeginEdit();
}
}
如果您有权访问数据网格,则可能没有必要找到它
例如
private void DataGridCell_GotFocus(object sender, RoutedEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
{
dGrid.BeginEdit();
}
}
更新:FocusManager
技巧
如果焦点是唯一可以通过设置FocusManager
来利用FocusManager.FocusedElement
的问题。尝试一下,它有效without any code behind
。
样品
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Name}"
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
请注意,我已通过绑定到self将FocusedElement
设置为TextBox
,这将使TextBox在加载后进入焦点(当它进入编辑模式时)