Datagrid commit changes User validation

Mar 19, 2009 at 3:19 PM
Edited Mar 20, 2009 at 7:31 AM
Hello all.

I just can't figure out how to get the following to work
I have a WCF application to get and save my information this all works wel. Now I want to show all my customers in a datagrid. Also no problem there.

Here comes the part that I do not seem to get working properly. If I edit a row and leave to row I want the user to confirm that the row needs to be saved or cancelled.
On a save I save the data in the collection and to the database On cancel I just revert the changes for this I implemented IEditableObject on my VM.

This is the part that works on partially. When i click outside of the grid I only get one EditRowEnding event. When I use the "EnterKey" I get it twice and when I change a row I get it about 10 times.

I have read alot of topics and articles on this. and The one most people refer to tells me that my VM should implement a Event for the endedit. But I do not want to assing a event handler to every object I might have I just want to handle it form the actions in the Datagrid

Below are the code parts:
VM
 public class CustomerVM : Customer, IEditableObject { public CustomerVM() : base(){}

public CustomerVM(Customer aCustomer) {  

this.Adress = aCustomer.Adress;

this.City = aCustomer.City;

this.ZIPCode = aCustomer.ZIPCode;

 }

sCustomer _copy;

public void BeginEdit() {

if (!IsInEditMode)

 {

/Save the object state

_copy = new Customer {

                    Adress =

this.Adress,

ZIPCode = this.ZIPCode

 };

IsInEditMode =

true;

 }

}

public void CancelEdit()  {

// restore original object state

if (_copy != null) {

this.Adress = _copy.Adress;
...
 

this.ZIPCode = _copy.ZIPCode;

 }

// clear cached data

_copy = null;

// ensure edit mode flag is unset

IsInEditMode =false;

 

 }

public void EndEdit() {

// clear cached data

 

 _

copy = null;

// ensure edit mode flag is unset

IsInEditMode = false;

 

 }

private bool _isInEditMode = false;

public bool IsInEditMode {

get { return _isInEditMode; }

private set{ if (_isInEditMode != value) {

 

_isInEditMode =

value;

this.RaisePropertyChanged("IsInEditMode");


View 

public

CustomersOverview()

{

InitializeComponent();

this.dgCustomers.ItemsSource = ServiceController.GetInstance().Customers;

this.dgCustomers.RowEditEnding += new EventHandler<DataGridRowEditEndingEventArgs>(dgCustomers_RowEditEnding);

 

}

void dgCustomers_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)

 

{

CustomerVM cust = e.Row.Item as CustomerVM;

if (cust != null && cust.IsInEditMode && e.EditAction == DataGridEditAction.Commit)

 

{

if (MessageBox.Show(string.Format("Wil je de gegevens van {0} opslaan?", cust.Name), "Gegevens opslaan", MessageBoxButton.OKCancel) == MessageBoxResult.OK)

 

{

cust.EndEdit();

ServiceController.GetInstance().UpdateCustomerAsync(cust);

 

}

else

 

{

cust.CancelEdit();

}

}

}