I am using the RadGridView for a data entry screen (using MVVM), the last row is always empty and when the user starts to enter data into it a new row is added to the bottom on the list. My issue is that once the itemSource is updated focus is taken out of the control and put into no mans land, making smooth data entry impossible.
The attached code is a cut down version of what i am doing and displays the same problem of lossing focus when the itemSource is updated.
XAML File
XMAL Code Behind
View model file
Property changed event
So my question is is there a way in which when the itemSource is updated focus isn't lost from the textbox.
The attached code is a cut down version of what i am doing and displays the same problem of lossing focus when the itemSource is updated.
XAML File
<Window
x:Class
=
"TelerikExample.MainWindow"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
Title
=
"MainWindow"
Height
=
"350"
Width
=
"525"
>
<
Window.Resources
>
<
DataTemplate
x:Key
=
"dtFirstName"
>
<
TextBox
Text
=
"{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
/>
</
DataTemplate
>
<
DataTemplate
x:Key
=
"dtSecondName"
>
<
TextBox
Text
=
"{Binding Path=SecondName, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
/>
</
DataTemplate
>
</
Window.Resources
>
<
Grid
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"*"
/>
</
Grid.RowDefinitions
>
<
telerik:RadGridView
Grid.Row
=
"1"
CanUserDeleteRows
=
"False"
CanUserInsertRows
=
"False"
CanUserSortColumns
=
"False"
ShowGroupPanel
=
"False"
AutoGeneratingColumn
=
"RadGridView_AutoGeneratingColumn"
ItemsSource
=
"{Binding Rows}"
RowIndicatorVisibility
=
"Collapsed"
AlternateRowBackground
=
"White"
AlternationCount
=
"2"
Background
=
"AliceBlue"
EditTriggers
=
"None"
HorizontalGridLinesBrush
=
"SlateGray"
SelectionMode
=
"Single"
SelectionUnit
=
"FullRow"
ShowColumnHeaders
=
"True"
IsFilteringAllowed
=
"False"
VerticalGridLinesBrush
=
"Transparent"
>
</
telerik:RadGridView
>
</
Grid
>
</
Window
>
XMAL Code Behind
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Data;
using
System.Windows.Documents;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Imaging;
using
System.Windows.Navigation;
using
System.Windows.Shapes;
namespace
TelerikExample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public
partial
class
MainWindow : Window
{
private
GridViewModel _viewModel;
public
MainWindow()
{
InitializeComponent();
_viewModel =
new
GridViewModel();
this
.DataContext = _viewModel;
}
private
void
RadGridView_AutoGeneratingColumn(
object
sender, Telerik.Windows.Controls.GridViewAutoGeneratingColumnEventArgs e)
{
if
(e.Column.UniqueName ==
"FirstName"
)
{
e.Column.CellTemplate = (DataTemplate)
this
.Resources[
"dtFirstName"
];
e.Column.Header =
"Forename"
;
}
else
if
(e.Column.UniqueName ==
"SecondName"
)
{
e.Column.CellTemplate = (DataTemplate)
this
.Resources[
"dtSecondName"
];
e.Column.Header =
"Surname"
;
}
else
if
(e.Column.UniqueName ==
"ViewModel"
)
{
e.Column.IsVisible =
false
;
}
}
}
}
View model file
namespace
TelerikExample
{
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.ComponentModel;
using
System.Dynamic;
using
System.Collections.ObjectModel;
public
class
GridViewModel : INotifyPropertyChanged
{
public
event
PropertyChangedEventHandler PropertyChanged;
private
ObservableCollection<dynamic> _rows;
/// <summary>
///
/// </summary>
/// <param name="name"></param>
protected
void
OnPropertyChanged(
string
name)
{
if
(PropertyChanged !=
null
)
{
PropertyChanged(
this
,
new
PropertyChangedEventArgs(name));
}
}
public
GridViewModel()
{
_rows =
new
ObservableCollection<dynamic>();
var row =
new
ExpandoObject()
as
IDictionary<
string
, Object>;
row.Add(
"FirstName"
,
string
.Empty);
row.Add(
"SecondName"
,
string
.Empty);
row.Add(
"ViewModel"
,
this
);
((INotifyPropertyChanged)row).PropertyChanged +=
new
PropertyChangedEventHandler(TelerikExample.PropertyChanged.Row_PropertyChanged);
_rows.Add(row);
}
public
void
CheckForNewRow()
{
IDictionary<
string
, Object> lastRow = _rows.Last()
as
IDictionary<
string
, Object>;
if
(((
string
)lastRow[
"FirstName"
]) !=
string
.Empty || ((
string
)lastRow[
"SecondName"
]) !=
string
.Empty)
{
//Add new row
var row =
new
ExpandoObject()
as
IDictionary<
string
, Object>;
row.Add(
"FirstName"
,
string
.Empty);
row.Add(
"SecondName"
,
string
.Empty);
row.Add(
"ViewModel"
,
this
);
((INotifyPropertyChanged)row).PropertyChanged +=
new
PropertyChangedEventHandler(TelerikExample.PropertyChanged.Row_PropertyChanged);
this
.Rows.Add(row);
}
}
public
ObservableCollection<dynamic> Rows
{
get
{
return
_rows;
}
set
{
if
(_rows != value)
{
_rows = value;
OnPropertyChanged(
"Rows"
);
}
}
}
}
}
Property changed event
namespace
TelerikExample
{
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.ComponentModel;
using
System.Dynamic;
public
class
PropertyChanged
{
public
static
void
Row_PropertyChanged(
object
sender, PropertyChangedEventArgs e)
{
object
value;
((IDictionary<
string
, Object>)sender).TryGetValue(
"ViewModel"
,
out
value);
GridViewModel vm = (GridViewModel)value;
vm.CheckForNewRow();
}
}
}
So my question is is there a way in which when the itemSource is updated focus isn't lost from the textbox.