1

それは MVVM 、MVVM light を使用した私の最初のプロジェクトです。PersonList Observable コレクションからリフレッシュされるリストボックスがあり、通常のリフレッシュを追加および削除します。問題はアイテムを編集するときです。

この問題のすべての解決策を探しましたが、何も機能しなかったため、何かを見逃したと思いました。

コードは次のとおりです。

 public class AdminViewModel : ApplicationPartBaseViewModel
{
   private ObservableCollection<Person> personList;

   public AdminViewModel()
    {

       this.context = new Entities();
       this.SavePersonCommand = new RelayCommand(() => this.SavePerson ());


       this.PersonList = new ObservableCollection<Peson>(context.Person.OrderBy(o => o.PersonName).ToList());


     }

      public ObservableCollection<Person> PersonList
    {
        get
        {
             return personList;
        }

        set
        {
            this.personList = value;
            RaisePropertyChanged("PersonList");
        }
    }


     private void SavePerson()
    {
      //Add and update code here
       this.context.SaveChanges();
       RaisePropertyChanged("PersonList");



    }


}

Person クラスは DataModel edmx から自動生成されたテンプレートです

 //------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

public partial class Person 
{
    #region Primitive Properties

    public virtual int PersonId
    {
        get;
        set;
    }

    public virtual string PersonName
    {
        get;
        set;
    }

    public virtual Nullable<int> PersonAge
    {
        get;
        set;
    }

    #endregion
    #region Navigation Properties

    public virtual ICollection<Humans> Humans
    {
        get
        {
            if (_human == null)
            {
                var newCollection = new FixupCollection<Human>();
                newCollection.CollectionChanged += FixupHuman;
                _human = newCollection;
            }
            return _human;
        }
        set
        {
            if (!ReferenceEquals(_human, value))
            {
                var previousValue = _human as FixupCollection<Human>;
                if (previousValue != null)
                {
                    previousValue.CollectionChanged -= FixupHuman;
                }
                _human = value;
                var newValue = value as FixupCollection<Human>;
                if (newValue != null)
                {
                    newValue.CollectionChanged += FixupAssets;
                }
            }
        }
    }
    private ICollection<Human> _human;

    #endregion
    #region Association Fixup

    private void FixupHuman(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Human item in e.NewItems)
            {
                if (!item.Person.Contains(this))
                {
                    item.Person.Add(this);
                }
            }
        }

        if (e.OldItems != null)
        {
            foreach (Human item in e.OldItems)
            {
                if (item.Person.Contains(this))
                {
                    item.Person.Remove(this);
                }
            }
        }
    }

    #endregion
}

RaisePropertyChangedを呼び出すと、MVVMライトがアイテムを更新すると思いました。私はとても混乱しています。

前もって感謝します。

4

1 に答える 1

2

最初のオプションは、可能であれば、自動生成されたクラスに INPC を実装することです。Fody.PropertyChangedをご覧ください

それが不可能な場合は、「仮想」としてのプロパティがあるため、次のような派生クラスでそれらをオーバーライドできます。

public class ObservablePerson : Person, INotifyPropertyChanged {
  public override int PersonId {
    get {
      return base.PersonId;
    }
    set {
      base.PersonId = value;
      OnPropertyChanged();
    }
  }

  public override string PersonName {
    get {
      return base.PersonName;
    }
    set {
      base.PersonName = value;
      OnPropertyChanged();
    }
  }

  public override int? PersonAge {
    get {
      return base.PersonAge;
    }
    set {
      base.PersonAge = value;
      OnPropertyChanged();
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  [NotifyPropertyChangedInvocator]
  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
      handler(this, new PropertyChangedEventArgs(propertyName));
  }
}

よりもAdminViewModelタイプのオブジェクトを使用して作業するようになりましたObservablePersonPerson

于 2013-06-17T14:39:10.327 に答える