1

私はmvvmに比較的慣れていませんが、ビューモデルからのバインディングについて質問があります. コンストラクターにオブザーバブルコレクションを設定したいビューモデルがあります。私のコンストラクタは次のようになります。

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

        InitializeViewModelData();
    }

InitializeViewModelData() は次のようになります。

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

私のプロパティ ModalityTypes は次のようになります。

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

言うまでもなく、私のリポジトリはデータベースを呼び出してデータを取得します。デバッグ時に、_studyRepository.RetrieveModalityTypes メソッドが実行されるよりも前に RaisePropertyChanged が実行されるように見えるため、空のプロパティにバインドされます。

ここで何か不足していますか?私のデザインは悪いですか?何か案は?

前もって感謝します、

4

2 に答える 2

1

バインディングは、フォームの初期化時にプロパティを検査します。また、PropertyChanged通知が発生したときにプロパティを検査します。そのため、プロパティのゲッターが 2 回呼び出される場合があります。

データを取得するための呼び出しは、Web サービス呼び出しか何かだと思いますか? Silverlight は非同期であるため、フォームが初期化された後でも Web サービス呼び出しが返される可能性があることを考慮する必要があります。

于 2013-02-09T13:02:11.533 に答える
0

ここで考慮すべきことが 2 つあります。

  1. ObservableCollection があります - それは監視可能です。そのため、ビュー モデルを初期化するときにコレクションを初期化すると、データ サービスがビューを返すときにコレクションを新しいコレクションに置き換えるのではなく、コレクションに追加すると正常に更新されます。
  2. データ サービスのデータ準備完了コールバックでコレクションを新しいコレクションに置き換える必要がある場合は、次のようにコレクション セッターを記述してください。

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

    }

于 2013-02-09T13:53:11.237 に答える