0

画面

デザイナーが上の画面のようなレイアウトを作成しました。主なアイデアは、ボタンをタップすると、画面の赤い部分 (つまり、1 つのテキスト ボックスではなく 2 つのテキスト ボックス) が変化する、1 つの画面のみを持つアプリケーションを作成することでした。このアプリケーションはマルチプラットフォーム アプリケーションで、MvvmCross を使用して作成しています。私の質問は、Mvvm でこの動作をどのように達成できるかということです。私の最初の考えはsgでした。以下のコードのようですが、この解決策には満足していません。この問題に対するより良い解決策はありますか? ShowViewModel() でデフォルトのナビゲーションを上書きする必要がありますか?

public class MainViewModel : MvxViewModel
{
     private MvxViewModel _currentViewModel;
     public MvxViewModel CurrentViewModel
     {
         get { return _currentViewModel; }
         set { _currentViewModel = value; RaisePropertyChanged(() => CurrentViewModel); }
     }

     public MainViewModel()
     {
         CurrentViewModel = new DefaultViewModel();
     }

     public void OnButtonClick()
     {
         CurrentViewModel = new SecondViewModel();
     }
 }

 public partial class MainViewModel : MvxViewController
 {

      public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        FirstViewModel.WeakSubscribe(ViewModelPropertyChanged);
    }

      private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        if (args.PropertyName == "CurrentViewModel")
        {
            if (Model.CurrentViewModel != null)
            {
                if (Model.CurrentViewModel is SecondViewModel) 
                {
                                            //remove bindings
                    //change View
                                            //bind new viewmodel
                }
            }
        }
    }
4

1 に答える 1

3

この種の「非ページ ナビゲーション」の代替手段は、MvvmCross Dialogのものと似ています。

あなたはできる:

  • MvxPresenterShowViewModel を使用できるように をカスタマイズします。
  • Core プロジェクトに特別なインターフェイスを配置し、Inversion of Control を使用して UI プロジェクトから Core プロジェクトに実装を注入します。
  • MvxMessenger プラグインを使用して、このタイプのナビゲーションをトリガーする Core プロジェクトと UI プロジェクトの間でメッセージを共有します。
  • IInteractionRequestViewModel で特別なインターフェイス ( など) を持つプロパティを使用します。このプロパティは、UI を変更する必要があるときにイベントを発生させます。

個人的には、あなたの状況では、これらのオプションの最初のオプションでShowViewModelあるプレゼンターを使用したインターセプトが非常に気に入っています。

CurrentViewModel私が検討できるもう 1 つの選択肢は、プロパティに基づいて子コンテンツを非常に簡単に更新できる、ある種の「アダプタ駆動」コントロールを使用することです。MvxLinearLayoutAndroid では、これはアダプタでを使用するのと同じくらい簡単です。ただし、iOS では、これを行うには何か新しいものを作成する必要があると思います。iOS には LinearLayout/StackPanel コントロールが実際にはないからです。

于 2013-09-12T11:31:33.490 に答える