Hi,
I am try to bind a RadGridView to DataView because of the Notify events that are already available. I am using the WPF MVVM architecture therefore the Grid is defined in the XAML and the DataView in my presentation Layer. I have a background worker that will populate the table in the DataView and I was hoping the RadGridView would then update accordingly. I am not too sure why it is not working or whether it can work in this context. Please see the code snippet below.
View:
<telerikGrid:RadGridView x:Name="activeSessionsGrid" AutoGenerateColumns="True" ItemsSource="{Binding Path=ActiveSessions}"
</telerikGrid:RadGridView>
Presentation Model:
private DataView _activeSessions;
public DataView ActiveSessions
{
get
{
return this._activeSessions;
}
}
private void GenereateTableStructure ( )
{
this._activeSessions = new DataView ( );
this._activeSessions.Table = new DataTable ( "Sessions" );
this._activeSessions.Table.Columns.Add ( "ID" );
this._activeSessions.Table.Columns.Add ( "Name" );
this._activeSessions.Table.Columns.Add ( "Surname" );
this._activeSessions.Table.Columns.Add ( "Designation" );
this._activeSessions.Table.Columns.Add ( "User Name" );
this._activeSessions.Table.Columns.Add ( "Email Address" );
this._activeSessions.Table.Columns.Add ( "Last Access Time" );
}
//BackgroundWorker that populates the _activeSessions table
Thanks in advance for your assistance.
5 Answers, 1 is accepted
You will need to raise manually PropertyChanged for this property (ActiveSessions).
Greetings,Vlad
the Telerik team

Hi Vlad,
Please excuse my ignorant but I have made the following changes but to no avail.
public DataView ActiveSessions
{
get
{
return this._activeSessions;
}
set
{
this._activeSessions = value;
PropertyChanged = new PropertyChangedEventHandler ( this.Notifychanges );
}
}
private void Notifychanges ( object sender, PropertyChangedEventArgs e )
{
if ( e.PropertyName != null )
PropertyChanged ( this, new PropertyChangedEventArgs ( e.PropertyName ) );
}
public event PropertyChangedEventHandler PropertyChanged;
Are you still using the field directly? Here is the code from your previous post:
private void GenereateTableStructure ( )
{
this._activeSessions = new DataView ( );
...You will need also just to raise the event not to create new event handler in the property setter.
Greetings,
Vlad
the Telerik team

Yes i am but the Property changed event is null as it has not been instantiated. I have included the entire class below.
public
class
ActiveSessionsPresentationModel:IActiveSessionsPresentationModel,INotifyPropertyChanged
{
private
IShellController controller;
private
IActiveSessionsView view;
private
IDataBrokerService dbProxy;
private
BackgroundWorker worker;
private
DataView _activeSessions;
public
ActiveSessionsPresentationModel ( IShellController controller, IActiveSessionsView view, IDataBrokerService dbProxy )
{
this
.controller = controller;
this
.view = view;
this
.dbProxy = dbProxy;
}
public
IActiveSessionsView View
{
get
{
return
this
.view;
}
}
public
DataView ActiveSessions
{
get
{
return
this
._activeSessions;
}
set
{
this
._activeSessions = value;
this
.Notifychanges (
this
,
new
PropertyChangedEventArgs (
"ActiveSessions"
) );
}
}
public
void
DisplayActiveSessions ( )
{
ActiveSessionsResponse response =
new
ActiveSessionsResponse ( );
response =
this
.dbProxy.ListActiveSessions ( );
GenereateTableStructure ( );
object
[ ] obj =
new
object
[ 1 ];
obj [ 0 ] = response.ActiveSessions;
this
.worker =
new
BackgroundWorker ( );
this
.worker.DoWork +=
new
DoWorkEventHandler ( worker_DoWork );
this
.worker.RunWorkerCompleted +=
new
RunWorkerCompletedEventHandler ( worker_RunWorkerCompleted );
this
.worker.RunWorkerAsync ( obj );
}
private
void
GenereateTableStructure ( )
{
this
._activeSessions =
new
DataView ( );
this
._activeSessions.Table =
new
DataTable (
"Sessions"
);
this
._activeSessions.Table.Columns.Add (
"ID"
);
this
._activeSessions.Table.Columns.Add (
"Name"
);
this
._activeSessions.Table.Columns.Add (
"Surname"
);
this
._activeSessions.Table.Columns.Add (
"Designation"
);
this
._activeSessions.Table.Columns.Add (
"User Name"
);
this
._activeSessions.Table.Columns.Add (
"Email Address"
);
this
._activeSessions.Table.Columns.Add (
"Last Access Time"
);
}
private
void
worker_RunWorkerCompleted (
object
sender, RunWorkerCompletedEventArgs e )
{
this
.worker.Dispose ( );
}
private
void
worker_DoWork (
object
sender, DoWorkEventArgs e )
{
object
[ ] obj = (
object
[]) e.Argument;
Dictionary<Guid, DateTime> sessions = ( Dictionary<Guid, DateTime> ) obj [ 0 ];
Parallel.ForEach ( sessions, pair =>
{
PersonResponse response =
this
.dbProxy.SelectPerson (
new
PersonIDRequest ( )
{
ID = pair.Key
} );
if
( response !=
null
)
{
_activeSessions.Table.NewRow ( );
DataRow row = _activeSessions.Table.NewRow ( );
row [
"ID"
] = pair.Key;
row [
"Name"
] = AccessControl.GetADUserFirstName ( response.Person.UserName );
row [
"Surname"
] = AccessControl.GetADUserSurname ( response.Person.UserName );
row [
"Designation"
] = AccessControl.GetADUserDesignation ( response.Person.UserName );
row [
"User Name"
] = response.Person.UserName;
row [
"Email Address"
] = AccessControl.GetADUserEmailAddress ( response.Person.UserName );
row [
"Last Access Time"
] = pair.Value;
_activeSessions.Table.Rows.Add ( row );
ActiveSessions = _activeSessions;
}
else
{
_activeSessions.Table.NewRow ( );
DataRow row = _activeSessions.Table.NewRow ( );
row [
"ID"
] = pair.Key;
row [
"Name"
] =
string
.Empty;
row [
"Surname"
] =
string
.Empty;
row [
"Designation"
] =
string
.Empty;
row [
"User Name"
] =
string
.Empty;
row [
"Email Address"
] =
string
.Empty;
row [
"Last Access Time"
] = pair.Value;
_activeSessions.Table.Rows.Add ( row );
}
} );
}
#region INotifyPropertyChanged Members
private
void
Notifychanges (
object
sender, PropertyChangedEventArgs e )
{
if
( e.PropertyName !=
null
)
PropertyChanged (
this
,
new
PropertyChangedEventArgs ( e.PropertyName ) );
}
public
event
PropertyChangedEventHandler PropertyChanged;
#endregion
}
public
interface
IActiveSessionsPresentationModel
{
IActiveSessionsView View
{
get
;
}
void
DisplayActiveSessions ( );
DataView ActiveSessions
{
get
;
}
}

Would i not also need to change my binding to
ItemsSource="{Binding Path=ActiveSessions, Mode=TwoWay}"