1

Windows Phone 8 と Windows ストアで利用できるアプリを開発しています。冗長性を減らすために、ポータブル クラス ライブラリ (PCL) を使用しています。その上で、MVVM Light PCL Toolkit を使用して MVVM パターンを適用しようとしています。ViewModel は PCL に配置され、アプリ ページの XAML に直接バインドされます。

データがエラーなしで受信されると、すべて正常に動作します。しかし、エラーが発生したときに例外/エラー メッセージをアプリに戻す方法がわかりません。

Windows ストア アプリ内ではエラーが MessageDialog として表示されますが、Wp8 アプリは MessageBox クラスを使用します。明らかに、PCL はこれらのクラスを認識していません。私が得ていないのは、ViewModel でエラーが発生したかどうかを知る方法と、アプリ内でメッセージを取得する方法です。ViewModels が XAML 内にバインドされている場合でも、これは可能ですか?

ViewModel (PCL 内)のコードは次のようになります。

DataService.Authenticate((token, error) =>
{
    if (error != null)
    {
        // This is, obviously, not going to work.
        MessageBox.Show(error.Message);
        return;
        }

    Token = token;
});

したがって、何らかの方法でエラーを保存しアプリ自体にエラーが発生したことを知らせてから、ユーザーにエラーを表示する一致する方法を呼び出す必要があります。

現在、BaseViewModel 内でエラー プロパティを定義し、ViewModel でエラーが発生したときにそれを埋めるようなことを考えています。次に、ページの CodeBehind で、現在の ViewModel を認識させ、PropertyChanged イベントをこの Error プロパティにバインドします。しかし、まだ実装できていないので、これが正しい方法であるかどうかはわかりません。

XAML 内で ViewModel をバインドするという考えから降りる必要がありますか? 代わりに、ページの分離コード内でそれらを初期化する必要がありますか?

4

1 に答える 1

0

あなたの本能は正しいですが、これにはいくつかの方法があります。

何よりもまず、Mvvm の Messaging ライブラリを使用ViewModelして、View にメッセージを直接送信できます。その後、View は任意の方法でそれを処理できますMessageDialog

ViewModelLocator次に、 forで関数またはアクション (おそらく前者) を作成することもできますShowMessageDialog。この関数は、おそらく を取り、stringを返しますTask。次に、ViewModelLocator最初に初期化した後、コードを挿入できますShowMessageDialog。その後、好きなプラットフォームViewModelsを使用できますMessageDialogs

元:

注: このコードは、Nuget でアクセスできる BCL Async ライブラリを使用します。それらは PCL で問題なく動作します。

ViewModelLocator:

public static Func<string, Task> ShowMessageDialog { get; set; }

アプリ.xaml.cs:

ViewModelLocator.ShowMessageDialog = (message) => 
    {
        // For Windows Phone
        return TaskFactory.StartNew(() => MessageBox.Show(message));

        // For Windows 8
        MessageDialog md = new MessageDialog(message);
        return md.ShowAsync().AsTask();
    };

ビューモデル:

await ViewModelLocator.ShowMessageDialog("This is my message.");

二次的な注意:md.ShowAsync().AsTask(); は UI スレッドで実行する必要があります。これは、タスクで非同期に実行している場合は、ディスパッチャーを介して呼び出す必要があることを意味します。これは、RunAsync メソッドを介してアプリの CoreDispatcher の使用を挿入する同様の方法を使用して可能です。

これは、任意のプラットフォーム (上記の Windows 8 および Windows Phone) で、任意のメッセージ ダイアログ システムを挿入して PCL で使用できることを意味します。

私が提案した最初の方法を実行する方がはるかに簡単だと思いますが、それはその目的のためですが、Function メソッドのバージョンは時々間違いなく役に立ちます。

于 2013-07-25T20:43:18.087 に答える