1

我对 mvvm 比较陌生,但是我有一个关于从视图模型绑定的问题。我有一个视图模型,我想在它的构造函数中填充一个 observablecollection。我的构造函数如下所示:

public StudySelectionViewModel() : base() {
        _studyRepository = StudyRepository.Instance;

        InitializeViewModelData();
    }

InitializeViewModelData() 如下所示:

        private void InitializeViewModelData() {
        _studyRepository.RetrieveModalityTypes();
        RaisePropertyChanged("ModalityTypes");
    }

我的属性 ModalityTypes 如下所示:

public ObservableCollection<ModalityType> ModalityTypes {
        get {
            return _studyRepository.ModalityTypes;
        }
    }

可能不用说我的存储库调用数据库并检索数据。调试时,看起来 RaisePropertyChanged 比我的 _studyRepository.RetrieveModalityTypes 方法更早执行,因此它绑定到一个空属性。

我在这里错过了什么吗?我的设计不好吗?有任何想法吗?

提前致谢,

4

2 回答 2

1

当表单初始化时,绑定将检查属性。它还会在PropertyChanged发出通知时检查属性 - 因此您可能会收到两次对属性 getter 的调用

我假设您获取数据的调用是网络服务调用或其他什么?Silverlight 是异步的,因此您需要考虑 Web 服务调用可能会在您的表单初始化后很好地返回

于 2013-02-09T13:02:11.533 回答
0

这里有两件事需要考虑。

  1. 你有一个 ObservableCollection - 它是可观察的,所以如果你在初始化视图模型时初始化集合,当你的数据服务返回视图时,添加到集合而不是用新集合替换它将会很好地更新。
  2. 如果您确实必须在数据服务数据就绪回调中将集合替换为新集合,请确保您这样编写集合设置器:

    public ObservableCollection<ModalityType> ModalityTypes {
    get {
        return _studyRepository.ModalityTypes;
    }
    set
       {
          this.__studyRepository.ModalityTypes = value;
          RaisePropertyChanged("ModalityTypes");
       {
    

    }

于 2013-02-09T13:53:11.237 回答