| Bernhard's profileBernhard Grojer - BlogPhotosBlogLists | Help |
|
|
April 09 Silverlight: DataBinding zu WCF Service - Teil 2/2
Dictionary<Customer, string> _ChangedObjects = new Dictionary<Customer, string>();
public void RegisterChangeTracking(Customer c)
{
c.PropertyChanged += (sender, e) =>
{
var cus = sender as Customer;
if (_ChangedObjects.ContainsKey(cus))
_ChangedObjects[cus] += ";" + e.PropertyName;
else
_ChangedObjects.Add(cus, e.PropertyName);
};
}Bevor nun ein Objekt in die Observable<T> Liste wandert (und somit im UI dargestellt wird) wird es mithilfe von RegisterChangeTracking T o) registriert. private void LoadCustomers()
{
CustomerServiceClient client = new CustomerServiceClient();
client.GetCustomersCompleted += (sender, e) =>
{
foreach (var c in e.Result)
{
_Customers.Add(c);
RegisterChangeTracking(c);
}
};
client.GetCustomersAsync();
}Nun müssen wir nur noch das Dictionary mit den geänderten Daten dem WCF Service übergeben. private void SaveCustomers()
{
CustomerServiceClient client = new CustomerServiceClient();
client.SaveCustomersCompleted += (sender, e) =>
{
var b = e.Result;
};
client.SaveCustomersAsync(_ChangedObjects);
}
Die Methode SaveCustomer wird nun aus der Silverlight-Anwendung aufgerufen (ein Button im UI triggert folgenden Code): private CustomerDataSource CustomerDataSource
{
get
{
return this.Resources["Customers"] as CustomerDataSource;
}
}
private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
CustomerDataSource.Save();
}
public bool SaveCustomers(Dictionary<Customer, string> Customers)
{
using (var DB = new NorthwindDataContext())
{
var query = from c in DB.Customers
where Customers.Keys.Select(cus => cus.CustomerID).Contains(c.CustomerID)
select c;
var lst = query.ToList();
Type t = typeof(Customer);
foreach (var kv in Customers)
{
var oldCustomer = kv.Key;
var newCustomer = lst.Single(cus => cus.CustomerID == oldCustomer.CustomerID);
foreach (var s in kv.Value.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries))
{
var propInfo = t.GetProperty(s);
var v = propInfo.GetValue(oldCustomer, null);
propInfo.SetValue(newCustomer, v,null);
}
}
DB.SubmitChanges();
}
return true;
}Das fertige Beispiel (selber Link wie im Teil 1 d. Blog-Serie) steht zum Download bereit: SilverlightConsumeWCF 08042009.zip TrackbacksThe trackback URL for this entry is: http://bgrojer.spaces.live.com/blog/cns!9D87CECB1EA8118F!599.trak Weblogs that reference this entry
|
|
|