Bonjour !
Voila mon problème :
J'utilise le dataform de Silverlight 4 dans une vue "bindé" sur un viewmodel (pattern MVVM). J'utilise "simple mvvm toolkit" et les WCF services RIA (ainsi que l'EntityFramework coté serveur).
Mon dataform est donc bindé sur une PagedCollectionView de mon ViewModel. Le contexte fonctionnel étant : une "Region" a plusieurs "territoires" et un territoire est rattaché a une région. (J'ai recréé mon problème sur la BD Northwind pour l'expliquer facilement).
Voila le code XAML de mon dataform :
Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <toolkit:DataForm Name="DataForm" ItemsSource="{Binding RegionTerritories}" CurrentItem="{Binding TerritorySelected, Mode=TwoWay}" AutoGenerateFields="True" AutoEdit="True" AutoCommit="False" IsReadOnly="False" Margin="0,10,0,0" EditEnded="DataForm_EditEnded" DeletingItem="DataForm_DeletingItem" AddingNewItem="DataForm_AddingNewItem" CurrentItemChanged="DataForm_CurrentItemChanged" />
Voila le code de mon ViewModel to charger les données dans la PagedCollectionView :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 this.RegionTerritories = new PagedCollectionView(this.CurrentRegion.Territories.ToList()); this.RegionTerritories.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(RegionTerritories_CollectionChanged);
Je surveille les changements de cette PagedCollectionView pour mettre à jour mon DomainContext (au travers du serviceAgent) en m'abonnant aux évènements de la PagedCollectionView:
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 private void RegionTerritories_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (var item in e.NewItems) { Territory territory = item as Territory; if (territory != null) { this.regionServiceAgent.InitializeNewTerritoryAndAddToDomainContext((Territory)item); territory.Region = this.CurrentRegion; this.CurrentRegion.Territories.Add(territory); } } break; case NotifyCollectionChangedAction.Remove: foreach (var item in e.OldItems) { Territory territory = item as Territory; if (territory != null) { if (this.CurrentRegion.Territories.Contains<Territory>(territory)) { this.regionServiceAgent.MarkForDeleteTerritory(territory); this.CurrentRegion.Territories.Remove(territory); } } } break; //case NotifyCollectionChangedAction.Replace: // break; //case NotifyCollectionChangedAction.Reset: // break; } }
Et voila le problème : si this.CurrentRegion.Territories est vide (la région n'a pas de territoire rattaché) et si j'ajoute un territoire, puis annule cet ajout (en cliquant sur "Cancel" du dataform), tout marche correctement jusqu'à la ligne this.CurrentRegion.Territories.Remove(territory);. Cette ligne créer unL'exception se produit à cause du this.RaiseDataMemberChanged("RegionID"); lorsque l'entité "Territory" ajoutée (puis suprimée) fait son boulot interne : .'System.NullReferenceException' occurs on System.Windows.Controls.Data.DataForm.Toolkit.
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /// <summary> /// Obtient ou définit la valeur « RegionID ». /// </summary> [DataMember()] [RoundtripOriginal()] public int RegionID { get { return this._regionID; } set { if ((this._regionID != value)) { this.OnRegionIDChanging(value); this.RaiseDataMemberChanging("RegionID"); this.ValidateProperty("RegionID", value); this._regionID = value; this.RaiseDataMemberChanged("RegionID"); // THIS CAUSE DATAFORM FAIL !! this.OnRegionIDChanged(); } } }
La chose bizarre c'est que si this.CurrentRegion.Territories n'est pas vide au départ, tout marche correctement, je peux ajouter puis annulé l'ajout correctement sans qu'une exception soit déclenchée...
Qu'est que je rate ?
Voila le lien de téléchargement de la solution qui reproduit le problème : https://skydrive.live.com/redir.aspx...ALulK7qBi40vJk
Lancer la solution, aller sur la page "regions", puis cliquer sur le dernier boutton en bas de la liste (la region qui n'a aucun territoire). Puis dans la popup qui s'ouvre, cliquer sur "Cancel" du dataform. Cela doit déclencher le bug.
Merci d'avance pour toute réponse !
Partager