Xceed数据网格:用键盘导航
问题描述:
我有一个数据网格,其使用DataTemplateSelector无论是作为文本框,组合框或滑块以显示不同的可编辑值编辑细胞。问题是我可以选中这些单元格,但无法用键盘编辑它们。我曾想象过,一旦细胞聚焦,我就可以编辑内部的物品。Xceed数据网格:用键盘导航
举例:Tab在文本框细胞>开始键入 举例:Tab键滑盖细胞>现在的工作重点>使用箭头键来编辑
像现在我必须用鼠标点击开始编辑。没有办法只用键盘开始编辑。
这里是我的代码:
<UserControl.Resources>
<!--#region DataTemplateSelector-->
<local:SettingsDataTemplateSelector x:Key="SettingsDataTemplateSelector" />
<DataTemplate x:Key="TextboxDataTemplate">
<xcdg:MaskedTextBox IsTabStop="True" Mask="{Binding EditMask}" Text="{Binding EditValue, IsAsync=False, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnExceptions=True}"/>
</DataTemplate>
<DataTemplate x:Key="ComboDataTemplate">
<ComboBox IsTabStop="True" ItemsSource="{Binding Path=SelectionValues}"
SelectedValuePath="Value"
SelectedValue="{Binding Path=SelectionValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ValueText">
</ComboBox>
</DataTemplate>
<DataTemplate x:Key="SliderDataTemplate">
<Slider IsTabStop="True" Value="{Binding EditSliderValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Minimum="{Binding MinRangeValue}"
Maximum="{Binding MaxRangeValue}"
VerticalAlignment="Bottom"
IsSnapToTickEnabled="True"
TickFrequency="1"
Margin="0,0,0,0"/>
</DataTemplate>
<!--#endregion-->
<xcdg:DataGridCollectionViewSource x:Key="Features"
Source ="{Binding Path=Demo.Features}"
AutoFilterMode="And"
AutoCreateDetailDescriptions="False"
AutoCreateItemProperties="False">
<xcdg:DataGridCollectionViewSource.DetailDescriptions>
<xcdg:PropertyDetailDescription RelationName="Settings" AutoCreateDetailDescriptions="False" AutoCreateItemProperties="False"/>
</xcdg:DataGridCollectionViewSource.DetailDescriptions>
</xcdg:DataGridCollectionViewSource>
</UserControl.Resources>
<Grid>
<!--#region Xceed DataGrid-->
<xcdg:DataGridControl x:Name="datagrid"
ItemsSource="{Binding Source={StaticResource Features}}"
KeyUp="DatagridKeyUp"
AllowDetailToggle="True"
Margin="10"
NavigationBehavior="RowOrCell"
CellEditorDisplayConditions="RowIsBeingEdited,
MouseOverCell, MouseOverRow, RowIsCurrent, CellIsCurrent"
EditTriggers="BeginEditCommand, ClickOnCurrentCell,
SingleClick, CellIsCurrent, ActivationGesture, RowIsCurrent"
ItemScrollingBehavior="Immediate"
AutoCreateColumns="False">
<xcdg:DataGridControl.Resources>
<Style TargetType="xcdg:TableViewScrollViewer">
<Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="VerticalScrollBarVisibility" Value="Auto" />
</Style>
</xcdg:DataGridControl.Resources>
<xcdg:DataGridControl.View>
<xcdg:TableflowView UseDefaultHeadersFooters="False" ColumnStretchMode="Last">
<xcdg:TableflowView.FixedHeaders>
<DataTemplate>
<xcdg:ColumnManagerRow />
</DataTemplate>
</xcdg:TableflowView.FixedHeaders>
</xcdg:TableflowView>
</xcdg:DataGridControl.View>
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="FeatureID" Title="FeatureID" ReadOnly="True" />
<xcdg:Column FieldName="Name" Title="Feature name" ReadOnly="True" />
<xcdg:Column FieldName="Description" Title="Description" ReadOnly="True" />
<xcdg:Column FieldName=" "/>
</xcdg:DataGridControl.Columns>
<xcdg:DataGridControl.DetailConfigurations>
<xcdg:DetailConfiguration RelationName="Settings" Title="">
<xcdg:DetailConfiguration.Columns>
<xcdg:Column FieldName="Name" Title="Name" ReadOnly="True"/>
<xcdg:Column FieldName="Description" Title="Description" ReadOnly="True"/>
<xcdg:Column FieldName="EditValues" Title="Edit Values" ReadOnly="True"/>
<xcdg:Column FieldName="EditValueVar" Title="Edit Value" Width="150" ReadOnly="False"
CellContentTemplateSelector="{StaticResource SettingsDataTemplateSelector}"
DisplayMemberBinding="{Binding}" />
<xcdg:Column FieldName=" "/>
</xcdg:DetailConfiguration.Columns>
</xcdg:DetailConfiguration>
</xcdg:DataGridControl.DetailConfigurations>
</xcdg:DataGridControl>
<!--#endregion-->
</Grid>
任何帮助表示赞赏。
答
我结束了使用Xceed的CellEditors。如果你想用键盘编辑,似乎没有办法绕过它们。
更改EditValueVar列如下:
<xcdg:Column FieldName="EditValueVar" Title="Edit Value" Width="150" ReadOnly="False"
CellEditorSelector="{StaticResource SettingsCellEditorSelector}"/>
注:删除DisplayMemberBinding,因为它可能会导致问题与动态数据
这里是CellEditors我现在使用:
<xcdg:CellEditor x:Key="maskEditor">
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<xcdg:MaskedTextBox Mask="{Binding EditMask}"
Text="{Binding Path=(xcdg:Cell.ParentCell).DataContext.EditValue,
RelativeSource={RelativeSource Self},
IsAsync=False, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnExceptions=True}"
Style="{StaticResource {x:Type xcdg:MaskedTextBox}}"/>
<!--Text="{Binding EditValueText, IsAsync=False, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnExceptions=True}"/>-->
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
<xcdg:CellEditor.ActivationGestures>
<xcdg:TextInputActivationGesture />
</xcdg:CellEditor.ActivationGestures>
</xcdg:CellEditor>
<xcdg:CellEditor x:Key="comboEditor">
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=(xcdg:Cell.ParentCell).DataContext.SelectionValues,
RelativeSource={RelativeSource Self}, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
SelectedValue="{Binding Path=(xcdg:Cell.ParentCell).DataContext.SelectionValue,
RelativeSource={RelativeSource Self},
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
DisplayMemberPath="ValueText"
Style="{StaticResource {x:Type ComboBox}}"
ItemContainerStyle="{StaticResource {x:Type ComboBoxItem}}"/>
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
<xcdg:CellEditor.ActivationGestures>
<xcdg:KeyActivationGesture SystemKey="Down"
Modifiers="Alt" />
<xcdg:KeyActivationGesture Key="Up"
Modifiers="Alt" />
<xcdg:KeyActivationGesture Key="F4" />
<xcdg:KeyActivationGesture Key="Space" />
</xcdg:CellEditor.ActivationGestures>
</xcdg:CellEditor>
<xcdg:CellEditor x:Key="sliderEditor">
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<Slider Value="{Binding Path=(xcdg:Cell.ParentCell).DataContext.EditSliderValue,
RelativeSource={RelativeSource Self},
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Minimum="{Binding Path=(xcdg:Cell.ParentCell).DataContext.MinRangeValue, RelativeSource={RelativeSource Self}}"
Maximum="{Binding Path=(xcdg:Cell.ParentCell).DataContext.MaxRangeValue, RelativeSource={RelativeSource Self}}"
Style="{StaticResource {x:Type Slider}}"
VerticalAlignment="Bottom"
IsSnapToTickEnabled="True"
TickFrequency="1"
Margin="0,0,0,0"/>
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
<xcdg:CellEditor.ActivationGestures>
<xcdg:KeyActivationGesture SystemKey="Right"
Modifiers="Alt" />
<xcdg:KeyActivationGesture Key="Left"
Modifiers="Alt" />
<xcdg:KeyActivationGesture Key="F4" />
<xcdg:KeyActivationGesture Key="Space" />
</xcdg:CellEditor.ActivationGestures>
</xcdg:CellEditor>
您可能会注意到奇怪(xcdg:Cell.ParentCell)
-stuff事情,是的,这是其丑无比,但这是乐git的做法。你可能有更好的运气只是用xcdg:CellEditorBinding
代替。
xcdg:CellEditorBinding
是结合这样的等价物:{Binding Path=(xcdg:Cell.ParentCell).Content, Mode=TwoWays, RelativeSource={RelativeSource Self}, UpdateSourceTrigger=PropertyChanged}
。
我在内容之前添加了.DataContext,这是因为我的数据的结构。
希望这可以帮助别人!