2

MVVM 内の ObservableCollection の概念を理解するのに苦労しています。まず、WPF や Silverlight ではなく、Windows 8/Metro アプリでこれを行っていることを指摘したいと思います。

マイクロソフトのドキュメントによると、このコレクションには次のような有用性があります。「項目が追加、削除、またはリスト全体が更新されたときに通知を提供する動的データ コレクションを表します。」私が理解していることから、バインディングが関係している場合、これは非常に役立ちます。ネット上で、実行時に ObservableCollection を作成してから作業することで、多くの簡単な例を見つけましたが、このコレクションをリポジトリで使用する適切な方法がわかりませんでした。

ORM データベース バックエンドの実装、または生の ADO.NET 実装である次のリポジトリ インターフェイスがあるとします。

public interface IRepository<T>
{
   ObservableCollection<T> GetAll();
   void Create();
   void Update();
   void Delete();
   T GetByKey(object key);
}

およびリポジトリをモデルとして使用する単純な ViewModel

public class ViewModel
{
   private ObservableCollection<Dummy> _obsListDummy;
   private RelayCommand _addCommand,_deleteCommand,_updateCommand;
   private IRepository<Dummy> _repositoryDummy;

   public class ViewModel()
   {
     _repositoryDummy=Factory.GetRepository<Dummy>();

   }  

   public ObservableCollection<Dummy> ObsListDummy
   {
     get
       {
          return _repositoryDummy.GetAll();
       }
   }

   public RelayCommand AddCommand
   {
     get
        {
           if (_addCommand == null)
       {
        _addCommand = new RelayCommand(p => DoAdd(); 
        //DoAdd method shows a popup for input dummy and then closes;
         );
       }
       return _myCommand;
        }

   }
   ........
}

私のビューは、グリッドを使用した単純な XAML であり、ダミー オブジェクトには INotifyPropertyChanged が実装されています。

現在、追加、更新、または削除した後のこの実装では、ObservableCollection は更新されません。代わりに IEnumerable を配置することもできましたが、リポジトリにある ObservableCollection と同期する方法の洗練された解決策は見当たりません。 CollectionChanged にサブスクライブする以外に、すべての状態を処理しますが、リポジトリで行うロジックと一緒に自分自身を繰り返すようです。さらに悪いことに、リポジトリから ObservableCollection へのプッシュ通知を受け取りたいとしましょう。

私の問題について理解できたことを願っています。

前もって感謝します。

4

2 に答える 2

1

ViewModel に実装する必要がINotifyPropertyChangedあり、ObsListDummy プロパティはコレクションに適用された変更について ViewModel に通知する必要があります。したがって、次のようになります。

public class ViewModel: INotifyPropertyChanged
{
    // Declare the event 
    public event PropertyChangedEventHandler PropertyChanged;

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

    private ObservableCollection<Dummy> _dummyCollection;

    public ObservableCollection<Dummy> DummyCollection 
    {
        get { return _dummyCollection; }
        set
        {
            // Set the value and then inform the ViewModel about change with OnPropertyChanged
            _dummyCollection = value;
            OnPropertyChanged("DummyCollection");
        }
    }
}

このインターフェイスと実装全体INotifyPropertyChangedには、イベントの宣言やイベントを発生させるヘルパー メソッドの作成などの汚い作業が含まれているため、MVVM Lightなどのライブラリを使用することをお勧めします。

于 2013-04-19T06:26:28.340 に答える
0

ViewModelObservableCollectionを格納するには、型のメンバーを使用する必要があります。DummyあなたのInitialize方法では、リポジトリからダミーを読み取り、Dummy ViewModelsそれらを作成してObservableCollection. Bindingこれで、使用するとビューが更新されますObsListDummy(そして、そのコレクションから追加/削除します。バインディングはパブリック プロパティでのみ機能することにも注意してください)。

現在、ObservableCollection読み取りごとに新しいものがあるだけで、イベントは含まれていないため、ビューは変更を認識しません。

さらに、ViewModel は INotifyPropertyChanged を実装する必要があります。

于 2013-04-19T06:03:18.187 に答える