Keyboard Support
RadPropertyGrid allows you to navigate through the items without using the mouse. The keyboard can entirely replace the mouse by allowing you to perform navigation and editing.
Please note that the keyboard navigation is supported only when RadPropertyGrid's property - RenderMode is set to Flat.
Here is the list of the keys that are supported:
Tab / Shift + Tab: Navigates through the items.
Ctrl + Shift + O: Sorts by OrderIndex and DisplayName.
Ctrl + Shift + C: Groups by GroupName.
Ctrl + Shift + Space: Expands the field that represents the current property definition.
Ctrl + End: Moves to the last field.
Ctrl + Home: Moves to the first field.
PageDown: Moves a page down.
PageUp: Moves a page up.
Custom Keyboard Command Provider
RadPropertyGrid provides an easy MVVM-friendly approach for customization of its default commands logic. If you want to modify the way RadPropertyGrid handles a particular key, you could create your own custom command provider and predefine the behaviour for that key.
The approach for accomplishing the purpose is to create a separate class, inherit PropertyGridCommandProvider and override the ProvideCommandsForKey(KeyEventArgs args) method. In this way, only the undesired behavior can be adjusted according to your requirements.
The class responsible for customizing the keyboard navigation should be similar to the one below:
Example 1: Creating custom command provider
public class CustomKeyboardCommandProvider : PropertyGridCommandProvider
{
public CustomKeyboardCommandProvider()
: base(null)
{
}
public CustomKeyboardCommandProvider(RadPropertyGrid propertyGrid)
: base(propertyGrid)
{
this.PropertyGrid = propertyGrid;
}
public override List<DelegateCommandWrapper> ProvideCommandsForKey(KeyEventArgs args)
{
List<DelegateCommandWrapper> actionsToExecute = base.ProvideCommandsForKey(args);
if (args.Key == Key.Tab)
{
actionsToExecute.Clear();
actionsToExecute.Add(new PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.MoveToNext, this.PropertyGrid));
if (!this.PropertyGrid.SelectedPropertyDefinition.IsExpanded)
{
actionsToExecute.Add(new PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.ExpandCurrentField, this.PropertyGrid));
}
}
if (args.Key == Key.Tab && Keyboard.Modifiers == ModifierKeys.Shift)
{
actionsToExecute.Clear();
actionsToExecute.Add(new PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.MoveToPrevious, this.PropertyGrid));
if (!this.PropertyGrid.SelectedPropertyDefinition.IsExpanded)
{
actionsToExecute.Add(new PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.ExpandCurrentField, this.PropertyGrid));
}
}
return actionsToExecute;
}
}
Public Class CustomKeyboardCommandProvider
Inherits PropertyGridCommandProvider
Public Sub New()
MyBase.New(Nothing)
End Sub
Public Sub New(ByVal propertyGrid As RadPropertyGrid)
MyBase.New(propertyGrid)
Me.PropertyGrid = propertyGrid
End Sub
Public Overrides Function ProvideCommandsForKey(ByVal args As KeyEventArgs) As List(Of DelegateCommandWrapper)
Dim actionsToExecute As List(Of DelegateCommandWrapper) = MyBase.ProvideCommandsForKey(args)
If args.Key = Key.Tab Then
actionsToExecute.Clear()
actionsToExecute.Add(New PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.MoveToNext, Me.PropertyGrid))
If Not Me.PropertyGrid.SelectedPropertyDefinition.IsExpanded Then
actionsToExecute.Add(New PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.ExpandCurrentField, Me.PropertyGrid))
End If
End If
If args.Key = Key.Tab AndAlso Keyboard.Modifiers = ModifierKeys.Shift Then
actionsToExecute.Clear()
actionsToExecute.Add(New PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.MoveToPrevious, Me.PropertyGrid))
If Not Me.PropertyGrid.SelectedPropertyDefinition.IsExpanded Then
actionsToExecute.Add(New PropertyGridDelegateCommandWrapper(RadPropertyGridCommands.ExpandCurrentField, Me.PropertyGrid))
End If
End If
Return actionsToExecute
End Function
End Class
Following up the code-snippet above, a press of Tab/ Shift + Tab keys will result in moving the focus to the property field above/ below and expanding it if possible. However, do not forget to remove the predefined commands for that particular key by calling the Clear() method.
The last thing to be done is to set CommandProvider Property of the RadPropertyGrid to be the newly-created CustomKeyboardCommandProvider class:
Example 2: Defining the custom command provider in XAML
<telerik:RadPropertyGrid x:Name="RadPropertyGrid">
<telerik:RadPropertyGrid.CommandProvider>
<my:CustomKeyboardCommandProvider PropertyGrid="{Binding ElementName=PropertyGrid1}" />
</telerik:RadPropertyGrid.CommandProvider>
</telerik:RadPropertyGrid>
Example 3: Set the custom command provider to RadPropertyGrid
this.RadPropertyGrid.CommandProvider = new CustomKeyboardCommandProvider(this.RadPropertyGrid);
Me.RadPropertyGrid.CommandProvider = New CustomKeyboardCommandProvider
Text Search Navigation
With the R2 2020 release, the RadPropertyGrid allows you to navigate to a specific property by pressing its first letter from the keyboard or starting to type the first couple letters from its name. This functionality is disabled by default. To enable it you need to set the IsTextSearchEnabled property to true.
Searching for a property by typing its first letter requires the RadPropertyGrid control to be focused.
Example 4: Enabling keyboard search navigation
<telerik:RadPropertyGrid x:Name="RadPropertyGrid" IsTextSearchEnabled="True"/>
Text Search Mode
When the user searches for a property by pressing a letter from the keyboard, the control will select the first property, which starts with the typed letter. This is the default behavior of the text search functionality. This behavior is controlled from the TextSearchMode property of the RadPropertyGrid. The supported modes of this enumeration property are: StartsWith and Contains.
Example 5: Contains Text Search Mode
<telerik:RadPropertyGrid x:Name="RadPropertyGrid" IsTextSearchEnabled="True" TextSearchMode="Contains"/>
Text Searh With Case Sensitive
By default, text search navigation is case-insensitive. You can make your search case-sensitive by using the IsTextSearchCaseSensitive property.
Example 6: Search with Case-Sensitive
<telerik:RadPropertyGrid x:Name="RadPropertyGrid" IsTextSearchEnabled="True" TextSearchMode="Contains" IsTextSearchCaseSensitive="True"/>
Text Search Timeout
In a scenario with a larger text for a property name, you may need to increase the time for typing more letters. The keyboard search text navigation functionality allows you to increase the timeout for resetting the typed text. This can be done through the TextSearch.AutoCompleteTimeout static property of the RadPropertyGrid. This property is of type TimeSpan.
Example 8: Increase the timeout for resetting the typed text
public MainWindow()
{
InitializeComponent();
Telerik.Windows.Controls.TextSearch.AutoCompleteTimeout = new TimeSpan(1500);
}
Disabling Navigation
As of Q1 2015 PropertyGridCommandProvider exposes a new property: EnableBuiltInNavigation. By default its value is set to "True". In order to disable the navigation which comes from "Flat" RenderMode, you can set its value to "False".
Example 10: Disabling navigation
public class CustomKeyboardCommandProviderWithoutNavigation : PropertyGridCommandProvider
{
public CustomKeyboardCommandProviderWithoutNavigation()
: base(null)
{
}
public CustomKeyboardCommandProviderWithoutNavigation(RadPropertyGrid propertyGrid)
: base(propertyGrid)
{
this.PropertyGrid = propertyGrid;
this.EnableBuiltInNavigation = false;
}
}
Public Class CustomKeyboardCommandProviderWithoutNavigation
Inherits PropertyGridCommandProvider
Public Sub New()
MyBase.New(Nothing)
End Sub
Public Sub New(ByVal propertyGrid As RadPropertyGrid)
MyBase.New(propertyGrid)
Me.PropertyGrid = propertyGrid
Me.EnableBuiltInNavigation = False
End Sub
End Class