2012-04-25 55 views
0

我使用MVVM模式(以及「簡單mvvm工具包」)和RIA服務(以及服務器端的EntityFramework)在視圖上使用silverlight 4數據表單。Silverlight,DataForm在使用PagedCollectionView添加和刪除實體時出現錯誤?

我的數據形式綁定到viewModel上的PagedCollectionView。邏輯上下文是「A'區域'有*'區域'和'區域'鏈接到'區域'」(我在Nothwind數據庫上重新創建原始問題來解釋它)。

<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" /> 

我的視圖模型加載在pagedCollectionView實體的代碼:

this.RegionTerritories = new PagedCollectionView(this.CurrentRegion.Territories.ToList());     
      this.RegionTerritories.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(RegionTerritories_CollectionChanged); 

我看在PagedCollectionView變化傾聽了「CollectionChanged」事件來更新我的DomainContext(throught「serviceAgent」) :

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; 
     } 
    } 

這裏是我的問題:如果「this.CurrentRegion.Territories」是空的(沒有領土的存在),如果我添加一個項目,然後直接着性它,取消行動使我通過「案例NotifyCollectionChangedAction.Remove:」如預期。一切工作,直到'this.CurrentRegion.Territories.Remove(領土);'這行代碼在System.Windows.Controls.Data.DataForm.Toolkit上創建一個「'System.NullReferenceException'」。異常附加在「this.RaiseDataMemberChanged(」RegionID「);」當「地區」實體進行內部更新時:。

/// <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(); 
      } 
     } 
    } 

的奇怪的事情是,如果「this.CurrentRegion.Territories」不爲空,在開始時,eveything正常工作......

什麼我'做錯了什麼?

解決方案的代碼細節的下載鏈接:

https://skydrive.live.com/redir.aspx?cid=e41cfc4c2d6196d4&resid=E41CFC4C2D6196D4!252&parid=E41CFC4C2D6196D4!215&authkey=!AALulK7qBi40vJk

勞克解決方案,進入「區域」頁面,然後點擊在列表中的最後一個項目的按鈕(土等於0 )。然後點擊數據表單的子窗口上的取消。這應該會出現錯誤。

感謝您的幫助!

+0

我下載了您的解決方案,並且在我測試時運行良好。不過,我正在使用Silverlight 5. – Bryant 2012-04-25 18:47:24

+0

您好!感謝您的回答 !我嘗試使用Silverlight 5.問題仍然存在。你究竟嘗試了什麼? – Ben 2012-04-26 07:20:34

+0

我剛剛打開你的項目,並按照你的指示,沒有得到任何錯誤。 – Bryant 2012-04-26 17:23:21

回答

0

這樣的回答能幫我解決這個問題: How to apply a Filter to a PagedCollectionView but prevent CollectionChanged event from firing on edit?

的解決方案是不聽PagedCollectionView的CollectionChanged事件,但聽PagedCollectionView.SourceCollection的CollectionChanged事件。

因此,代碼變成:

ObservableCollection<Territory> territories = new ObservableCollection<Territory>(this.CurrentRegion.Territories); 
this.RegionTerritories = new PagedCollectionView(territories); 
territories.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(RegionTerritories_CollectionChanged);    

感謝您的幫助科比,感謝#1!

相關問題