This question is locked. New answers and comments are not allowed.
I am having trouble figuring out how to accomplish a couple things with RadGridView. Here is what I want to happen:
- When a row is selected, the focus should be the entire row, not a specific cell.
- Pressing Tab should move the selection to the next row. Pressing Tab on the last row should proceed to the next control on the form. Similar behavior should occur for Shift+Tab.
- Pressing Enter should change the expanded/collapsed state of the selected row.
Here is the XAML that I am using for this:
<
UserControl
x:Class
=
"RadControlsSilverlightApp1.MainPage"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable
=
"d"
d:DesignWidth
=
"640"
d:DesignHeight
=
"480"
>
<
Grid
x:Name
=
"LayoutRoot"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
/>
<
RowDefinition
Height
=
"Auto"
/>
</
Grid.RowDefinitions
>
<
telerik:RadComboBox
Grid.Row
=
"0"
Height
=
"25"
Width
=
"100"
Margin
=
"10"
>
<
telerik:RadComboBoxItem
Content
=
"First"
/>
<
telerik:RadComboBoxItem
Content
=
"Second"
/>
<
telerik:RadComboBoxItem
Content
=
"Third"
/>
</
telerik:RadComboBox
>
<
telerik:RadGridView
Grid.Row
=
"1"
x:Name
=
"grid"
IsFilteringAllowed
=
"False"
AutoGenerateColumns
=
"False"
CanUserDeleteRows
=
"False"
CanUserInsertRows
=
"False"
CanUserFreezeColumns
=
"False"
CanUserReorderColumns
=
"False"
CanUserResizeColumns
=
"False"
CanUserSortColumns
=
"False"
RowIndicatorVisibility
=
"Collapsed"
ShowGroupPanel
=
"False"
ShowInsertRow
=
"False"
SelectionUnit
=
"FullRow"
>
<
telerik:RadGridView.Columns
>
<
telerik:GridViewDataColumn
IsReadOnly
=
"True"
Width
=
"90"
DataMemberBinding
=
"{Binding Path=DateAdded,StringFormat='d'}"
>
<
telerik:GridViewColumn.Header
>
<
TextBlock
>Date<
LineBreak
/>Added</
TextBlock
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewToggleRowDetailsColumn
Width
=
"30"
/>
<
telerik:GridViewDataColumn
Header
=
"Name"
IsReadOnly
=
"True"
TextWrapping
=
"Wrap"
Width
=
"*"
DataMemberBinding
=
"{Binding Path=Name}"
/>
<
telerik:GridViewDataColumn
Header
=
"City"
Width
=
"150"
DataMemberBinding
=
"{Binding Path=City}"
TextWrapping
=
"Wrap"
/>
<
telerik:GridViewDataColumn
Width
=
"65"
DataMemberBinding
=
"{Binding Path=DuesOwed}"
TextAlignment
=
"Right"
>
<
telerik:GridViewColumn.Header
>
<
TextBlock
HorizontalAlignment
=
"Center"
>Dues<
LineBreak
/>Owed</
TextBlock
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
Width
=
"70"
IsReadOnly
=
"True"
>
<
telerik:GridViewColumn.Header
>
<
TextBlock
>Eligibility</
TextBlock
>
</
telerik:GridViewColumn.Header
>
<
telerik:GridViewColumn.CellTemplate
>
<
DataTemplate
>
<
telerik:RadButton
Height
=
"Auto"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
Margin
=
"0"
Padding
=
"0"
BorderThickness
=
"0"
Content
=
"Verify"
/>
</
DataTemplate
>
</
telerik:GridViewColumn.CellTemplate
>
</
telerik:GridViewDataColumn
>
</
telerik:RadGridView.Columns
>
<
telerik:RadGridView.RowDetailsTemplate
>
<
DataTemplate
>
<
Grid
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
Width
=
"135"
/>
<
ColumnDefinition
Width
=
"*"
/>
</
Grid.ColumnDefinitions
>
<
telerik:RadGridView
Grid.Column
=
"1"
HorizontalAlignment
=
"Left"
ShowColumnHeaders
=
"False"
IsReadOnly
=
"True"
ItemsSource
=
"{Binding Path=PurchasedItems}"
IsTabStop
=
"False"
AutoGenerateColumns
=
"False"
CanUserDeleteRows
=
"False"
CanUserInsertRows
=
"False"
CanUserFreezeColumns
=
"False"
CanUserReorderColumns
=
"False"
CanUserResizeColumns
=
"False"
CanUserSortColumns
=
"False"
RowIndicatorVisibility
=
"Collapsed"
ShowGroupPanel
=
"False"
ShowInsertRow
=
"False"
>
<
telerik:RadGridView.Columns
>
<
telerik:GridViewDataColumn
Header
=
"Item"
IsGroupable
=
"False"
DataMemberBinding
=
"{Binding Path=Description}"
IsSortable
=
"False"
IsReadOnly
=
"True"
Width
=
"100"
/>
<
telerik:GridViewDataColumn
Header
=
"Price"
Width
=
"65"
IsGroupable
=
"False"
DataMemberBinding
=
"{Binding Path=Price}"
IsSortable
=
"False"
IsReadOnly
=
"True"
TextAlignment
=
"Right"
HeaderTextAlignment
=
"Center"
/>
</
telerik:RadGridView.Columns
>
</
telerik:RadGridView
>
</
Grid
>
</
DataTemplate
>
</
telerik:RadGridView.RowDetailsTemplate
>
</
telerik:RadGridView
>
<
telerik:RadButton
Grid.Row
=
"2"
Height
=
"25"
Width
=
"100"
Content
=
"Do Something!"
Margin
=
"10"
/>
</
Grid
>
</
UserControl
>
And the code-behind:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Windows.Controls;
using
System.Windows.Input;
using
Telerik.Windows.Controls;
using
Telerik.Windows.Controls.GridView;
namespace
RadControlsSilverlightApp1
{
public
partial
class
MainPage : UserControl
{
public
MainPage()
{
InitializeComponent();
PersonData person1 =
new
PersonData { DateAdded =
new
DateTime(2011, 10, 16), Name =
"Bob"
, City =
"San Francisco"
, DuesOwed =
"$145.68"
};
person1.PurchasedItems.Add(
new
PurchasedItem { Description =
"Tennis shoes"
, Price =
"$79.99"
});
person1.PurchasedItems.Add(
new
PurchasedItem { Description =
"Sports jacket"
, Price =
"$150.00"
});
PersonData person2 =
new
PersonData { DateAdded =
new
DateTime(2012, 02, 03), Name =
"Gary"
, City =
"Boston"
, DuesOwed =
"$12.00"
};
person2.PurchasedItems.Add(
new
PurchasedItem { Description =
"Plasma television"
, Price =
"$1599.99"
});
person2.PurchasedItems.Add(
new
PurchasedItem { Description =
"Radio"
, Price =
"$14.99"
});
List<PersonData> data =
new
List<PersonData> { person1, person2 };
grid.ItemsSource = data;
grid.KeyboardCommandProvider =
new
ExpandCollapseKeyboardCommandProvider(grid);
}
}
public
class
PersonData
{
public
DateTime DateAdded {
get
;
set
; }
public
string
Name {
get
;
set
; }
public
string
City {
get
;
set
; }
public
string
DuesOwed {
get
;
set
; }
public
List<PurchasedItem> PurchasedItems {
get
;
private
set
; }
public
PersonData()
{
PurchasedItems =
new
List<PurchasedItem>();
}
}
public
class
PurchasedItem
{
public
string
Description {
get
;
set
; }
public
string
Price {
get
;
set
; }
}
public
class
ExpandCollapseKeyboardCommandProvider : DefaultKeyboardCommandProvider
{
private
RadGridView parentGrid;
public
ExpandCollapseKeyboardCommandProvider(RadGridView parentGrid)
:
base
(parentGrid)
{
this
.parentGrid = parentGrid;
}
public
override
IEnumerable<ICommand> ProvideCommandsForKey(Key key)
{
var commandList =
base
.ProvideCommandsForKey(key).ToList();
if
(key == Key.Tab)
{
int
rowIndex =
this
.parentGrid.Items.IndexOf(
this
.parentGrid.SelectedItem);
if
((Keyboard.Modifiers & ModifierKeys.Shift) > 0)
{
if
(rowIndex > 0)
{
commandList.Clear();
commandList.Add(RadGridViewCommands.MoveUp);
commandList.Add(RadGridViewCommands.SelectCurrentUnit);
}
}
else
if
(rowIndex + 1 <
this
.parentGrid.Items.Count)
{
commandList.Clear();
commandList.Add(RadGridViewCommands.MoveDown);
commandList.Add(RadGridViewCommands.SelectCurrentUnit);
}
}
if
(key == Key.Enter)
{
commandList.Clear();
commandList.Add(RadGridViewCommands.ExpandHierarchyItem);
}
return
commandList;
}
}
}
If I am starting at the combobox on the form, then the desired functionality would be to only press Tab 4 times to return back to the combobox. But tabbing into the grid does not show the first row as selected. And tabbing in the last row just moves the selected cell until it reaches the end and then proceeds to the button.
I have been spinning my wheels trying to get this to work. Any help would be greatly appreciated.
Thanks,
Brian