Wpf ObservableCollection事件触发两次时ItemEndEdit出现问题

Wpf ObservableCollection事件触发两次时ItemEndEdit出现问题,wpf,datagrid,observablecollection,Wpf,Datagrid,Observablecollection,datagrid两次插入/更新行时出现问题。datagrid绑定到一个可观察的集合,该集合中添加了ItemEndEdit事件: /// <summary> /// extends the ObservableCollection class to include adding an ItemEndEdit event /// </summary> public class ObservableProjectExpenseItems : ObservableCollecti

datagrid两次插入/更新行时出现问题。datagrid绑定到一个可观察的集合,该集合中添加了ItemEndEdit事件:

/// <summary>
/// extends the ObservableCollection class to include adding an ItemEndEdit event
/// </summary>
public class ObservableProjectExpenseItems : ObservableCollection<ProjectExpenseItemsBO>
{
    protected override void InsertItem(int index, ProjectExpenseItemsBO item)
    {
        base.InsertItem(index, item);
        item.ItemEndEdit += new ProjectExpenseItemsBO.ItemEndEditEventHandler((x) =>
        {
            if (ItemEndEdit != null)
                ItemEndEdit(x);
        });
    }

    public event ProjectExpenseItemsBO.ItemEndEditEventHandler ItemEndEdit;
}
更新和插入两次火,我不知道为什么。我在初始化类/视图模型时附加ItemEndEdit:

ObservableProjectExpenseItems projectExpenseItemsCollection;
List<ProjectExpenseItemsBO> list = new List<ProjectExpenseItemsBO>(projectExpenseItemsRepository.GetProjectExpenseItems(this.ProjectExpenseID));
list.ForEach(item => ProjectExpenseItemsCollection.Add(item));
ProjectExpenseItemsCollection.ItemEndEdit += new ProjectExpenseItemsBO.ItemEndEditEventHandler(ProjectExpenseItemsItemEndEdit);
observedProjectExpenseItems项目费用项目集合;
列表列表=新列表(projectExpenseItemsRespository.GetProjectExpenseItems(this.ProjectExpenseID));
list.ForEach(item=>ProjectExpenseItemsCollection.Add(item));
ProjectExpenseItemsCollection.ItemEndEdit+=新的ProjectExpenseItemsBO.ItemEndedItemEventHandler(ProjectExpenseItemsSiteMendEdit);
最后,这里是我的datagrid:

    void ProjectExpenseItemsItemEndEdit(IEditableObject sender)
    {
        ProjectExpenseItemsBO projectExpenseItemsBO = sender as ProjectExpenseItemsBO;
        if (projectExpenseItemsBO.RowID == 0)
        {
            // if the ProjectExpenseItemsBO is a new row
            projectExpenseItemsRepository.AddProjectExpenseItem(projectExpenseItemsBO, this.ProjectExpenseID);
        }
        else
        {
            projectExpenseItemsRepository.UpdateProjectExpenseItem(projectExpenseItemsBO);
        }
        // get the total of the project expense items
        ItemTotal = projectExpenseItemsRepository.GetItemTotal(this.ProjectExpenseID);
    }
<DataGrid ItemsSource="{Binding Path=ProjectExpenseItemsCollection}" Grid.Row="0" Grid.Column="0" AutoGenerateColumns="False" 
  Name="dgProjectExpenseItems" SelectionMode="Single" SelectionUnit="FullRow" CanUserResizeColumns="True" 
  SelectedItem="{Binding Path=SelectedProjectExpenseItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
  GridLinesVisibility="Horizontal" CanUserDeleteRows="True" CanUserAddRows="True">
  <DataGrid.RowValidationRules>
   <vr:RowDataInfoValidationRule ValidationStep="UpdatedValue" />
  </DataGrid.RowValidationRules>
  <DataGrid.Columns>
   <DataGridTextColumn Header="ID" Width="SizeToCells" IsReadOnly="True" MinWidth="50" Binding="{Binding RowID}" />
   <DataGridTextColumn Header="Project Expense ID" IsReadOnly="True" Width="SizeToCells" Visibility="Hidden" MinWidth="0" Binding="{Binding ProjectExpenseID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
   <DataGridTextColumn Header="Item Number" Width="SizeToCells" MinWidth="140" Binding="{Binding ItemNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
   <DataGridTextColumn Header="Item Description" Width="SizeToCells" MinWidth="250" Binding="{Binding ItemDescription, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
   <!--<DataGridTextColumn Header="Qty" Width="SizeToCells" MinWidth="65" Binding="{Binding ItemQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />-->
   <DataGridTextColumn Header="Qty">
    <DataGridTextColumn.Binding>
     <Binding Path="ItemQty" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
       <vr:PositiveDecimalValidationRule ValidationStep="RawProposedValue" />
      </Binding.ValidationRules>
     </Binding>
    </DataGridTextColumn.Binding>
   </DataGridTextColumn>
   <DataGridTextColumn Header="Unit Price">
    <DataGridTextColumn.Binding>
     <Binding Path="ItemUnitPrice" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
       <vr:PositiveDecimalValidationRule ValidationStep="RawProposedValue" />
      </Binding.ValidationRules>
     </Binding>
    </DataGridTextColumn.Binding>
   </DataGridTextColumn>
   <!--<DataGridTextColumn Header="Unit Price" Width="SizeToCells" MinWidth="90" Binding="{Binding ItemUnitPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />-->
   <DataGridTextColumn Header="Supplier Name" Width="SizeToCells" MinWidth="200" Binding="{Binding SupplierName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
  </DataGrid.Columns>
 </DataGrid>

好的。在试图找出我遇到的另一个问题后,我无意中发现是什么导致了事件两次爆发。当我在datagrid中保存一行时,我注意到主键字段值在保存前后都为零。显然,这是因为调用viewmodel中的save方法后我没有刷新集合。当我在viewmodel中更改代码以刷新集合时:

    void ProjectExpenseItemsItemEndEdit(IEditableObject sender)
    {
        ProjectExpenseItemsBO projectExpenseItemsBO = sender as ProjectExpenseItemsBO;
        if (projectExpenseItemsBO.RowID == 0)
        {
            // use the data access layer to update the wrapped data object
            projectExpenseItemsRepository.AddProjectExpenseItem(projectExpenseItemsBO, this.ProjectExpenseID);
        }
        else
        {
            projectExpenseItemsRepository.UpdateProjectExpenseItem(projectExpenseItemsBO);
        }

        //refresh the collection
        ProjectExpenseItemsCollection.Clear();
        List<ProjectExpenseItemsBO> list = new List<ProjectExpenseItemsBO>(projectExpenseItemsRepository.GetProjectExpenseItems(this.ProjectExpenseID));
        list.ForEach(item => ProjectExpenseItemsCollection.Add(item));

        // get the total of the project expense items
        ItemTotal = projectExpenseItemsRepository.GetItemTotal(this.ProjectExpenseID);

    }
void ProjectExpenseItemsItemEndEdit(IEditableObject发送方)
{
ProjectExpenseItemsBO ProjectExpenseItemsBO=发送方作为ProjectExpenseItemsBO;
如果(projectExpenseItemsBO.RowID==0)
{
//使用数据访问层更新包装的数据对象
projectExpenseItemsRepository.AddProjectExpenseItem(projectExpenseItemsBO,this.ProjectExpenseID);
}
其他的
{
projectExpenseItemsRepository.UpdateProjectExpenseItem(projectExpenseItemsBO);
}
//刷新集合
ProjectExpenseItemsCollection.Clear();
列表列表=新列表(projectExpenseItemsRespository.GetProjectExpenseItems(this.ProjectExpenseID));
list.ForEach(item=>ProjectExpenseItemsCollection.Add(item));
//获取项目费用项目的总计
ItemTotal=ProjectExpenseItemsRespository.GetItemTotal(this.ProjectExpenseID);
}

重复记录的问题消失了。哇,我已经为此工作了两周了。有趣的是,如此基本的东西会让你在这么长的时间里陷入循环,特别是当你试图学习新东西(wpf、mvvm)时。

好吧。在试图找出我遇到的另一个问题后,我无意中发现是什么导致了事件两次爆发。当我在datagrid中保存一行时,我注意到主键字段值在保存前后都为零。显然,这是因为调用viewmodel中的save方法后我没有刷新集合。当我在viewmodel中更改代码以刷新集合时:

    void ProjectExpenseItemsItemEndEdit(IEditableObject sender)
    {
        ProjectExpenseItemsBO projectExpenseItemsBO = sender as ProjectExpenseItemsBO;
        if (projectExpenseItemsBO.RowID == 0)
        {
            // use the data access layer to update the wrapped data object
            projectExpenseItemsRepository.AddProjectExpenseItem(projectExpenseItemsBO, this.ProjectExpenseID);
        }
        else
        {
            projectExpenseItemsRepository.UpdateProjectExpenseItem(projectExpenseItemsBO);
        }

        //refresh the collection
        ProjectExpenseItemsCollection.Clear();
        List<ProjectExpenseItemsBO> list = new List<ProjectExpenseItemsBO>(projectExpenseItemsRepository.GetProjectExpenseItems(this.ProjectExpenseID));
        list.ForEach(item => ProjectExpenseItemsCollection.Add(item));

        // get the total of the project expense items
        ItemTotal = projectExpenseItemsRepository.GetItemTotal(this.ProjectExpenseID);

    }
void ProjectExpenseItemsItemEndEdit(IEditableObject发送方)
{
ProjectExpenseItemsBO ProjectExpenseItemsBO=发送方作为ProjectExpenseItemsBO;
如果(projectExpenseItemsBO.RowID==0)
{
//使用数据访问层更新包装的数据对象
projectExpenseItemsRepository.AddProjectExpenseItem(projectExpenseItemsBO,this.ProjectExpenseID);
}
其他的
{
projectExpenseItemsRepository.UpdateProjectExpenseItem(projectExpenseItemsBO);
}
//刷新集合
ProjectExpenseItemsCollection.Clear();
列表列表=新列表(projectExpenseItemsRespository.GetProjectExpenseItems(this.ProjectExpenseID));
list.ForEach(item=>ProjectExpenseItemsCollection.Add(item));
//获取项目费用项目的总计
ItemTotal=ProjectExpenseItemsRespository.GetItemTotal(this.ProjectExpenseID);
}
重复记录的问题消失了。哇,我已经为此工作了两周了。有趣的是,如此基本的东西会让你陷入如此漫长的循环,特别是当你试图学习新东西(wpf、mvvm)时