2

私は Windows Phone 7 アプリケーションに取り組んでいます。ユーザーが別のビューに移動する指定されたボタンをタップした後、ビューを切り替える必要があります。

理論的には、MVVM のどのコンポーネントがナビゲーション、つまりビューの切り替えを担当する必要がありますか? コード スニペットは、デモンストレーションを示すのに適しています。

ビューに切り替えコードを挿入しようとしましたが、問題なく動作しますが、非同期 Web サービスを呼び出して、操作が完了した後にのみユーザーを新しいビューにナビゲートしたい状況に遭遇しました。ナビゲーション コードはイベントハンドラ。

ありがとうございました。

P/S: プロジェクトの締め切りが迫っています。MVVM Light、Caliburn Micro などの MVVM ツールを使用してプロジェクトを再構築する時間がありません。

4

3 に答える 3

2

すべての ViewModel が共有する基本クラスに Navigate メソッドを配置します。

protected void Navigate(string address)
{
    if (string.IsNullOrEmpty(address))
        return;

    Uri uri = new Uri(address, UriKind.Relative);
    Debug.Assert(App.Current.RootVisual is PhoneApplicationFrame);
    BeginInvoke(() =>
        ((PhoneApplicationFrame)App.Current.RootVisual).Navigate(uri));
}

protected void Navigate(string page, AppViewModel vm)
{
    // this little bit adds the viewmodel to a static dictionary
    // and then a reference to the key to the new page so that pages can
    // be bound to arbitrary viewmodels based on runtime logic
    string key = vm.GetHashCode().ToString();
    ViewModelLocator.ViewModels[key] = vm;

    Navigate(string.Format("{0}?vm={1}", page, key));
}

protected void GoBack()
{
    var frame = (PhoneApplicationFrame)App.Current.RootVisual;
    if (frame.CanGoBack)
        frame.GoBack();
}

したがって、ViewModel 基本クラスは、ナビゲーションが必要な場合に実行します。次に、通常、一部の派生 ViewModel クラスが、View 内のボタンまたはハイパーリンクにバインドされた ICommand の実行に応答して、ナビゲーションのターゲットを制御します。

protected SelectableItemViewModel(T item)
{
    Item = item;
    SelectItemCommand = new RelayCommand(SelectItem);
}

public T Item { get; private set; }

public RelayCommand SelectItemCommand { get; private set; }

protected override void SelectItem()
{
    base.SelectItem();
    Navigate(Item.DetailPageName, Item);
}

したがって、View はナビゲート アクションが必要なときだけを認識し、ViewModel は (ViewModel と Model の状態に基づいて) 移動先とそこに到達する方法を認識します。

于 2013-06-01T14:58:51.113 に答える
0

ビューの表示/非表示を担当するクラスに、MVVM の外にナビゲーションを配置しました。

ViewModel は、weakevents を持つメッセージ ブローカを使用して、このクラスにメッセージを発行します。

このセットアップは私に最も自由を与え、そこに属さない MVVM クラスに責任を負わせません。

于 2013-06-01T16:58:52.103 に答える