ObservableCollection以及存储库

时间:2013-04-19 05:56:30

标签: c# wpf xaml mvvm windows-8

我在掌握MVVM中的ObservableCollection概念时遇到了麻烦。首先,我想指出我在Windows 8 / Metro应用程序中执行此操作,而不是WPF或Silverlight。

根据microsoft文档,此集合具有以下用途: “表示动态数据集合,在添加,删除项目或刷新整个列表时提供通知。”根据我的理解,这涉及到绑定时会帮助你很多。在网上我发现了很多简单的例子,通过在运行时创建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,Dummy对象也实现了INotifyPropertyChanged。

现在添加或更新或删除后的这个实现,ObservableCollection不刷新,我知道我可以放IEnumerable,但我不会看到如何使存储库与ObservableCollection同步的优雅解决方案在模型中,除了查询到CollectionChanged之外,你在那里处理所有的状态,但似乎我会重复自己和我在存储库中做的逻辑。更糟糕的是,让我说我希望从我的存储库向ObservableCollection获取一些推送通知。

我希望我能理解我的问题。

提前致谢。

2 个答案:

答案 0 :(得分: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这样的库。

答案 1 :(得分:0)

您应该使用ObservableCollection类型的成员来存储您的Dummy ViewModel。在Initialize方法中,您从存储库中读取虚拟对象,创建Dummy ViewModels并将其放入ObservableCollection。现在,当您使用BindingObsListDummy(并从该集合中添加/删除)时,您的视图将会更新,同时请注意Binding仅适用于公共属性。

现在,每次阅读都只有一个新的ObservableCollection,不涉及任何事件,因此您的视图永远不会知道更改。

此外,您的ViewModel将实现INotifyPropertyChanged。