これを行うにはいくつかの方法があると思いますが、これが外部ライブラリを使用せずに実現する最も簡単な方法です。
ユーティリティ クラスNavigationUtility
(または何でも) を作成し、次の構造を実装します。
public static class NavigationUtility
{
// The object to send
private static object passedObject = null;
// A method to fetch the object
public static object GetObject() {
// implementation below
}
// Utility method to check if an object was passed
public static bool HasObject()
{
return passedObject != null;
}
// A method to navigate to a page
public static void Navigate(string url, object obj = null)
{
// implementation below
}
}
これが実装するインターフェイスです。ビュー間の遷移中にオブジェクトを安全に保つプライベート変数と、送信された情報をナビゲートおよびフェッチするためのメソッドがあります。
これを正しい方法で実装するには、考慮すべき点がいくつかあります。
- 渡されたオブジェクトは 1 回だけフェッチできる必要があります。そうしないと、不注意に使用すると、間違ったオブジェクトがプログラムの間違った部分に表示される可能性があります。
- アプリケーション全体をナビゲートするためのメソッドの代わりにこれを使用するには、
NavigationService.Navigate(Uri)
オブジェクトを送信する必要がない状況も処理できる必要があります。
GetObject
それでは、インターフェイスの最初のメソッドと、その実装方法を見てみましょう。
public static object GetPassedObject()
{
var obj = passedObject;
passedObject = null;
return obj;
}
ご覧のとおり、プロパティがフェッチされるたびに内部の passedObject を null にすることで、要件 #1 を簡単に処理します。これは次のように機能します (受信ビューで)。
NavigationUtility.HasObject(); // returns true if an object was sent
var data = NavigationUtility.GetObject() as SomeModel; // fetches the object and casts it
NavigationUtility.HasObject(); // returns false always;
ここで面白いことに - メソッドの実装Navigate
:
public static void Navigate(string url, object obj = null)
{
// Saves the object
passedObject = obj;
if( url != null && url.length > 0 )
{
// Creates the Uri-object
Uri uri = new Uri(url, UriKind.Relative);
// Navigates the user (notice the funky syntax - so that this can be used from any project
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri);
}
}
以上です!