2

我无法掌握 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,虚拟对象也实现了 INotifyPropertyChanged。

现在,在添加或更新或删除此实现之后,ObservableCollection 不会刷新,我知道我可以使用 IEnumerable 代替,但我没有看到如何使存储库与 ObservableCollection 中的同步的优雅解决方案模型,除了订阅 CollectionChanged 并在那里处理所有状态,但似乎我会重复自己以及我在存储库中执行的逻辑。更糟糕的是,假设我想从我的存储库中获得一些推送通知,发送给 ObservableCollection。

我希望我了解我的问题。

提前致谢。

4

2 回答 2

1

您应该INotifyPropertyChanged在您的 ViewModel 上实现,并且您的 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

您应该使用 type 的成员ObservableCollection来存储您的DummyViewModel。在您的Initialize方法中,您从存储库中读取虚拟对象,创建Dummy ViewModels并将它们放入ObservableCollection. 现在,当您使用Bindingto ObsListDummy(并从该集合中添加/删除,还请注意 Binding 仅适用于公共属性)时,您的视图将得到更新。

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

此外,您的 ViewModel 应实现 INotifyPropertyChanged。

于 2013-04-19T06:03:18.187 回答