3

MainViewModelとQuestionViewModelの2つのViewModelがあります。ViewModelLocatorに登録します。

SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<QuestionViewModel>();

MainViewModelには、質問のあるリストボックスがあります。クリックするとこのコマンドを実行します

NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml", UriKind.Relative));
Messenger.Default.Send<Question, QuestionViewModel>(q);

QuestionPageのDataContextがQuestionViewModelに設定されています。QuestionViewModelでメッセージを登録します:

Messenger.Default.Register<Question>(this, q =>
{
    MessageBox.Show("!");
});

ただし、QuestionViewModelインスタンスは最初のオープンでのみ作成されるため、この関数はQuestionViewModelの2回目のオープンでのみ機能します。私の質問は次のとおりです。MVVMLightでQuestionViewModelのインスタンスをいつどこで作成する必要がありますか?起動時にすべてのページを作成したくありません。

次に、コンストラクターViewModelLocatorでインスタンスを作成します。

public ViewModelLocator()
{
    ServiceLocator.Current.GetInstance<QuestionViewModel>();
}

それは良い習慣ですか?

4

1 に答える 1

3

そうです、これはコンストラクターですべてのビューモデルを作成するための良い習慣ではありませんViewModelLocator。あなたが得た問題の理由はあなたがQuestionViewModelメッセージを送った後に作成されるということです。現在のオブジェクトを共有するサービスを作成し、このサービスをとに挿入することができQuestionます。MainViewModelQuestionViewModel

public interface IQuestionService
{
    Question CurrentQuestion {get; set;}
}

public class QuestionService : IQuestionService
{
    public Question CurrentQuestion {get; set;}
}

次に、現在の質問を保存ClickMainViewModelます。

_questionService.CurrentQuestion = q;

で使用しますQuestionViewModel

ビューモデルにIQuestionServiceの同じインスタンスを注入することを確認してください。

もう1つの変形は、次のようなURLで単純なナビゲーション引数を渡すことです。

NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml?questionid=" + q.Id, UriKind.Relative));

または、パラメーターの受け渡しをサポートする独自のNavigationServiceを実装することもできますが、これはより複雑です。

于 2012-08-09T16:36:47.713 に答える