DataGrid´;s SelectedItem在UnitOfWork.SaveChanges之后丢失绑定

本文关键字:之后 SaveChanges 绑定 UnitOfWork #180 SelectedItem DataGrid | 更新日期: 2023-09-27 17:57:41

我目前正在开发一个使用EntityFramework的应用程序。在这个应用程序中,有一个DataGrid,SelectedItem绑定到ViewModel上的一个属性:

<DataGrid AutoGenerateColumns="False"
          CanUserDeleteRows="True"
          IsReadOnly="True"
          IsSynchronizedWithCurrentItem="False"
          ItemsSource="{Binding ZuvTextCollection}"
          SelectedItem="{Binding SelectedEntity,
                                 UpdateSourceTrigger=PropertyChanged,
                                 Mode=TwoWay}">

现在我遇到的问题是,一旦存储了数据,到SelectedItem的绑定似乎几乎丢失了。

编辑:我忘了一个非常重要的点!对不起!此错误仅在创建新记录后发生。

protected override void OnSave()
{
    if (!this.OnCanSave())
    {
        return;
    }
    this.UnitOfWork.SaveChanges();
    this.IsDirty = this.UnitOfWork.ChangeTracker.HasChanges;
}

打电话后。UnitOfWork.SaveChanges,与ViewModel中属性的绑定已不存在。DataGrid中的行确实可以进行选择,但选择的更改不会到达ViewModel中。

可能是什么?

附言:我读过以下帖子http://www.devexpress.com/Support/Center/Question/Details/Q509665但我必须承认,这让我不知道如何解决我的问题。谢谢你的帮助!

DataGrid´;s SelectedItem在UnitOfWork.SaveChanges之后丢失绑定

@lll:我忘了一个非常重要的点!对不起!此错误仅在创建新记录后发生。

public ZuvText SelectedEntity
{
    get
    {
        return this.selectedEntity;
    }
    set
    {
        var entity = value;
        if (this.selectedEntity != null)
        {
            this.selectedEntity.PropertyChanged -= this.OnEntityPropertyChanged;
            this.selectedEntity.DisableContinuousValidation();
        }
        if (entity != null)
        {
            entity.PropertyChanged += this.OnEntityPropertyChanged;
            entity.EnableContinuousValidation();
        }
        this.SetProperty(ref this.selectedEntity, entity);
    }
}

实体是在保存之前设置的,即在创建新项目时。(当光标移动到新实体时,它就是SelectedEntity)

现在,一位队友找到了原因。在我们实体的基类中,Equals和GetHashCode被覆盖:

public bool Equals(TEntity other)
{
    if (object.ReferenceEquals(null, other))
    {
        return false;
    }
    if (object.ReferenceEquals(this, other))
    {
        return true;
    }
    return this.id == other.Id;
}
public override bool Equals(object obj)
{
    if (object.ReferenceEquals(null, obj))
    {
        return false;
    }
    if (object.ReferenceEquals(this, obj))
    {
        return true;
    }
    if (obj.GetType() != this.GetType())
    {
        return false;
    }
    return this.Equals(obj as TEntity);
}
public override int GetHashCode()
{
    // ReSharper disable once NonReadonlyFieldInGetHashCode
    return this.id.GetHashCode();
}

GetHashCode的重写导致存储之前和之后的id分别提供不同的hashCode,并且不再检测到对象。目前,我们已经注释掉了GetHashCode的覆盖。然而,我还不知道这个问题的真正解决方案。我的队友已经在寻找解决方案,但也许你有想法?

我们有一个解决方案!更新ID后,DataGrid Selector找不到所选对象。这就是为什么我们现在将实际的EntityCollection放在适配器或包装类中。

public class ZuvTextAdapter
{
    public ZuvText ZuvText
    {
        get;
        set;
    }
}

DataForce如下所示:

public ObservableCollection<ZuvTextAdapter> ZuvTextAdapterCollection...

并且仅将所选实体作为:

public ZuvTextAdapter SelectedAdapter

因此,我们的GetHeshCode解决了这个问题,保存后绑定工作正常。(我的队友解决了!)