绑定问题构造函数viewmodel

时间:2013-02-09 12:59:51

标签: c# silverlight mvvm

我对mvvm比较新,但我有一个关于从viewmodel绑定的问题。 我有一个viewmodel,在其构造函数中我想填充一个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方法,因此它会绑定到空属性。

我在这里遗漏了什么吗?我的设计不好吗?有什么想法吗?

提前致谢,

2 个答案:

答案 0 :(得分:1)

绑定将在表单初始化时检查属性。它还会在引发PropertyChanged通知时检查该属性 - 因此您可以两次调用该属性的getter

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

答案 1 :(得分:0)

这里有两件事要考虑。

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

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

    }