3

ViewModels(ConfigurationViewModelと)が 2 つありEditConfigurationViewModelます。ConfigurationViewModel私は次のコードを持っています:

    public ConfigurationViewModel()
    {
        NewConfigCommand = new MvxRelayCommand(DoNewConfig);
        EditConfigCommand = new MvxRelayCommand<ConfigurationSet>(DoEditConfig);
    }

    private void DoNewConfig()
    {
        this.RequestNavigate<EditConfigurationViewModel>();
    }

    private void DoEditConfig(ConfigurationSet config)
    {
        this.RequestNavigate<EditConfigurationViewModel>(new { id = config.Id.ToString() });
    }

EditConfigurationViewModel には、次のコードがあります。

    public EditConfigurationViewModel()
    {
        Configuration = new ConfigurationSet();
    }

    public EditConfigurationViewModel(string id)
    {
        Configuration = ConfigDataStore.GetConfiguration(Guid.Parse(id));
    }

私が達成したいのは非常に単純なことです...が起動されたConfigurationViewModelときに、に移動し、パラメーターなしのコンストラクターを使用したいと考えています。が起動されたら、を受け取るコンストラクターを使用したいと思います。NewConfigCommandEditConfigurationViewModelEditConfigCommandstring

このコードの問題は、どのコマンドが起動されても、パラメーターなしのコンストラクターが常に使用され、コードが他のコンストラクターに到達しないことです。

パラメーターなしのコンストラクターを削除していくつかの実験を行った結果、他のコンストラクターが呼び出され、期待される結果が得られましたが、パラメーターなしのコンストラクターが存在しないために例外をスローEditConfigurationCommandしようとすると(NewConfigurationCommandここまでは順調ですね)。

残念ながら、現時点では VS2010 がインストールされていないため、PCL コードを介してデバッグすることはできません...「アイ デバッグ」を行ったところ、このクラスが見つかりましたMvxViewModelLocator。問題はここのどこかにあると思います。たぶん、DoLoadそれを取得しようとするときのメソッドでMethodInfo...

この時点で、私が何か間違ったことをしているのか、それともこれが期待される結果なのかを知りたかっただけです。その間、私はVS2010をインストールするチャンスをつかみ、何も壊れないことを祈ります...

4

1 に答える 1

4

PCL のデバッグの問題については、Win8 または WP7/8 の UI を追加するだけでなく、PCL コードを介してデバッグできます...


主な質問-複数のコンストラクターの使用方法について...そうしないことをお勧めします。

include私にとって、編集と新規作成は 2 つの異なるビューと 2 つの異なるビューモデルです。これらは共通のプロパティと共通のレイアウトを共有する場合がありますが、これは継承、UserControls、 axml などを使用して実現できます。

新規および編集に一般的に使用するものの例については、https://github.com/slodge/MvvmCross/tree/vnext/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement/ViewModelsを参照してください。


1 つのビューモデルを引き続き使用することを主張する場合は、New に「魔法の値」を使用することを検討できます。たとえば、Guid.Empty が渡された場合、それは新しいことを意味しますか?


または、パラメーターなしのコンストラクターを削除して、2 番目のコンストラクターに既定値を追加することもできます。

public EditConfigurationViewModel(string id = null)
{
    Guid value;
    if (id == null || !Guid.TryParse(id, out value))
    {
        Configuration = new ConfigurationSet();
    }
    else
    {
        Configuration = ConfigDataStore.GetConfiguration(value);
    }
}

私はそれがうまくいくと思いますか?


最後に、いずれも適切でないと思われる場合は、ViewModel 構築メカニズムをオーバーライドすることを検討してください。

これを支援するために、MvvmCross 用に独自のデフォルト ViewModelLocator を作成する方法に関するかなり詳細な最近の投稿があります - http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.htmlを参照してください

このアプローチを使用すると、より多くのカスタム ナビゲーション モデルを作成できます。または、これが唯一の特別なビュー モデルである場合は、次のようなデフォルトの viewModelLocator を作成できると思います。

public class MyViewModelLocator
    : MvxDefaultViewModelLocator
{
    public override bool TryLoad(Type viewModelType, IDictionary<string, string> parameterValueLookup,
                                 out IMvxViewModel model)
    {
        if (viewModelType == typeof(EditConfigurationViewModel))
        {
            string id;
            if (parameterValueLookup.TryGetValue("id", out id))
            {
                model = new EditConfigurationViewModel(id);
            }
            else
            {
                model = new EditConfigurationViewModel();
            }
            return true;
        }
        return base.TryLoad(viewModelType, parameterValueLookup, IMvxViewModel model);
    }
}

次を使用して、そのロケーターを App.cs に登録します。

protected override IMvxViewModelLocator CreateDefaultViewModelLocator()
{
     return new MyViewModelLocator();
}
于 2013-01-16T21:15:01.343 に答える