9

ここ数週間、MVVMCross フレームワークを使用してクロス プラットフォーム アプリ (IOS/Android/WP7) の開発に取り組んできました。今日、解決方法がよくわからない問題に遭遇したので、うまくいけば、正しい方向に私を押し進めることができます.

IOS では、別のページに移動するための次の構造があります (以下のコードは ViewModel にあります)。

KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5");

public IMvxCommand BeckhoffActuator1
{
    get
    {           
        return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1));
    }
}

この IMvxCommand が起動される (ボタンが押される) と、次のビュー (この場合は BeckhoffActuatorViewModel) が読み込まれます。BeckhoffActuatorView のコードでは、上記のキーと値のペアを使用します。

public class BeckhoffActuatorView : MvxTouchDialogViewController<BeckhoffActuatorViewModel>
{

    ICollection<string> icol;

    public BeckhoffActuatorView(MvxShowViewModelRequest request) : base(request, UITableViewStyle.Grouped, null, true)
    {

        icol = request.ParameterValues.Values;

    }

    public override void ViewDidLoad()
    {
        //Code
    }
}

この構造は IOS では正常に機能していますが、Android アプリでも同じ構造を使用したいと考えています。

ViewModel のコードは変更されていません。それが MVVM の全体的な考え方だからです。ただし、BackhoffActuatorView のコードは Android では異なります。

public class BeckhoffActuatorView : MvxBindingActivityView<BeckhoffSensorViewModel>
{
    public ICollection<string> icol;

    public BeckhoffActuatorView()
    {
        Debug.WriteLine("Standard");
    }

    public BeckhoffActuatorView(MvxShowViewModelRequest request)
    {
        Debug.WriteLine("Custom");

        icol = request.ParameterValues.Values;
    }

    protected override void OnViewModelSet()
    {

        SetContentView(Resource.Layout.BeckhoffActuatorView);

    }
}

上記のコードは機能しません。MvxBindingActivityView は、私が IOS で使用している ViewController に似たものを実装していないようです。コードは標準コンストラクターにのみ含まれており、それを完全に除外すると、コンパイル/実行されません。

RequestNavigate で送信した keyvaluepair にアクセスできることを知っている人はいますか? ありがとうございました!

4

1 に答える 1

11

MVVMCross は非常に慣例に基づいており、可能な限り ViewModel 間でメッセージを渡すという考えに基づいています。

以下を使用して ViewModel に移動する場合:

KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5");

public IMvxCommand BeckhoffActuator1
{
    get
    {           
        return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1));
    }
}

次に、コンストラクターを使用して BeckhoffActuatorViewModel でそれを取得できるはずです。

public class BeckhoffActuatorViewModel : MvxViewModel
{
    public BeckhoffActuatorViewModel(string short)
    {
        ShortValue = short;
    }

    private string _shortValue;
    public string ShortValue
    {
        get
        {
            return _shortValue;
        }
        set
        {
            _shortValue = value;
            FirePropertyChanged("ShortValue");
        }
    }
}

その後、ビューにアクセスできますViewModel.ShortValue(iOS の場合は base.ViewDidLoad() の後に、Android の場合は OnCreate() の後に、WP7 の場合は OnNavigatedTo の後に)。

この例として、TwitterSearch の例を見てみましょう。

これには、次を使用してナビゲートを呼び出す HomeViewModel があります。

    private void DoSearch()
    {
        RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
    }

コンストラクターを使用して searchTerm を受け取る TwitterViewModel:

    public TwitterViewModel(string searchTerm)
    {
        StartSearch(searchTerm);
    }

現在、このメッセージ パッシングでは sのみが許可されていることに注意してください。ただし、 stringJSON.Net を使用して独自のオブジェクトをいつでもシリアル化できます。また、フレームワークを拡張することもできます。これはオープン ソースです。

string現在、このコンストラクター パラメーターの受け渡しでは、s 、ints、doubles、およびs のみが許可されていることに注意してくださいbool。これは、Xaml URL および Android インテントのシリアル化要件によるものです。独自のカスタム シリアライズ オブジェクトを使用してナビゲーションを試してみたい場合は、http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.htmlを参照してください。

また、匿名オブジェクト ナビゲーション ( ) を使用する場合は、属性が設定されRequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });ていることを確認する必要があることに注意してください。https://github.com/slodge/MvvmCrossTwitterSearch/blob/master/TwitterSearch.Core/Propertiesを参照してください。 /AssemblyInfo.cs :InternalsVisibleTo

[assembly: InternalsVisibleTo("Cirrious.MvvmCross")]

さらに...気弱な人向けではありません...これは「良いmvvmコード」ではありません...しかし、Androidアクティビティ内のMvxShowViewModelRequestデータに本当にアクセスしたい/必要な場合は、着信インテント - リクエストを含む Extras 文字列があります ( https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.csCreateViewModelFromIntentの逆シリアル化を参照し てください)

于 2012-04-17T14:12:29.493 に答える