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:
- TwoWay updates the target property or the property whenever either the target property or the source property changes.
- OneWay updates the target property only when the source property changes.
- OneTime updates the target property only when the application starts or when the DataContext undergoes a change.
- OneWayToSource updates the source property when the target property changes.
- Default causes the default Mode value of target property to be used.
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.