The Problem:

I spent a whole day to solve the problem with the Grid. I applied all my knowledge but with no solution. Suddenly I tried one thing, and it worked. So thought of sharing with guys. The problem was that the datagrid does not update the info after i edit. The information remains the same. Let's start from the beginning.

Create a class:

Lets create a DTO object for the DataGrid.The properties are:

public string TaskName { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public string AssignedTo { get; set; }
public string Comments { get; set; }
public string Status { get; set; }

Create the DataGrid:

<data:DataGrid x:Name="dataGrid" Grid.Row="3" Grid.ColumnSpan="3" Margin="0,-1,0,1" AutoGenerateColumns="False" >
<data:DataGrid.Columns>
<data:DataGridTemplateColumn CanUserSort="True" Header="Task Name">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding TaskName}"></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding TaskName }"></TextBox>
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>

<data:DataGridTemplateColumn CanUserSort="True" Header="Module Name">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ModuleName}"></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding ModuleName}"/>
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>

I am leaving rest to you.

The problem:

Now run the project and try to change any field. You will face the problem. The values will be not updated. I tried with implementing the IPropertyChanged interface on the DTO class. That doesn't help either.

The Solution:

The solution is very easy. It's the Binding mode property. The defination says all. Gets or sets a value that indicates the direction of the data flow in the binding. And the value definitions are:

You use the Mode property to specify the direction of the binding. The following enumeration list shows the available options for binding updates:

It didn't strike me for a long time. When I used google for the solution I found many posts without the solution. Here goes the EditTemplate binding:

<data:DataGridTemplateColumn Header="Comments">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Comments}"></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox AcceptsReturn="True" Text="{Binding Comments,Mode=TwoWay}"></TextBox>
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>

Change all the bindings now.

Update Database:

Now let' try the RowEditEnded Event of the DataGrid:

void dataGrid_RowEditEnded(object sender, DataGridRowEditEndedEventArgs e)
{
TaskList selected = (TaskList)dataGrid.SelectedItem;//TaskList is my DTO Class
//You can get all the fileds using selected object,for eg: selected.StartDate
//Call WCF here

}

Hope this helps. Enjoy coding.