我在具有 MVVM 模式(和“简单的 mvvm 工具包”)和 RIA 服务(以及服务器端的 EntityFramework)的视图上使用 silverlight 4 数据表单。
我的数据表单绑定到 viewModel 上的 PagedCollectionView。逻辑上下文是“一个 'Region' 有 * 'Territories' 并且一个 'Territory' 链接到一个 'Region'”(我在 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);
我通过监听“CollectionChanged”事件来观察 PagedCollectionView 上的更改以更新我的 DomainContext(通过“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”为空(不存在任何领土),并且如果我添加一个项目然后直接取消它,取消操作会让我按预期传递“case NotifyCollectionChangedAction.Remove:” . 一切正常,直到'this.CurrentRegion.Territories.Remove(territory);' 这行代码创建了一个“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”一开始不是空的,那么一切都可以正常工作......
我做错了什么?
代码详情解决方案下载链接:
启动解决方案,转到“区域”页面,然后单击列表中最后一项的按钮(区域等于 0)。然后单击数据窗体的子窗口上的取消。这应该会使错误出现。
谢谢你的帮助 !