2

私はWPF、MVVMの初心者です。今、私はMVVM Lightを調査しています。私は混乱しました。皆さんからの助けに感謝します。この投稿をご覧いただきありがとうございます。

  1. ビューの背後にあるコードを完全に削除できますか (.xaml 内のどこかで InitializeComponent() を呼び出す --> いくつかの単純なケースでは、view.xaml.cs はもう必要ありません)。

  2. 私のプロジェクトには多くのビューの洞察がありますが、いくつのロケーターが必要ですか? ビューごとに個別のロケーターを作成するつもりです。そして、app.xml にすべてのロケーターを登録すると、ユーザーがアプリケーションを実行した直後にすべてのビューが初期化および登録されるのだろうか? はいの場合、パフォーマンスが良くありませんか?

  3. 主な質問: 私にはシナリオがあります: 私には次のような多くの形式があります:

    1. MainForm: アプリケーションによって呼び出される最初のフォームです。
    2. ImportForm: ユーザーが (MainForm から) [インポート] をクリックすると呼び出される

仮定: バインディングに関連するすべての作業を完了しました (ボタンのインポート --> RelayCommand(OnImport) など)。このシナリオを実装するためのベスト プラクティスは何ですか? 1. 以下のように ImportForm を init に実装して表示するだけです。

public void OnImport()
{
   ImportForm importForm = new ImportForm();
   importForm.ShowDialog();
}

単純ですが、MVVM のパラダイムに従っているのでしょうか。

  1. だから、私はいくつかの調査を行い、次のような別の方法を行いました:

    public void OnImport() { //// メッセージを送信するだけ Messenger.Default.Send( new NotificationMessage(this, "OnImport")); }

コード ビハインド: MainForm.xaml.cs

public MainForm()
    {
        InitializeComponent();
        Messenger.Default.Register<NotificationMessage>(this, (nm) =>
        {
           if (nm.Sender == this.DataContext)
           {    
                if (nm.Notification == "OnImport")
                {  
                    ImportForm importForm = new ImportForm();
                    importForm.ShowDialog();
                }
           }
        });
    }

この方法では、コードビハインド内にコードを記述しなければなりません --> 問題はありますか?

上記のソリューションはどちらも上記のシナリオを正しく完了することができますが、どちらが優れているか混乱していますか、実際に正しいソリューションはありますか?

長い質問にお付き合いいただき、重ねてお礼申し上げます。

4

1 に答える 1

1
  1. いいえ、あなたがすることはできません。InitializeComponent()UI を画面に描画します。MVVM の目的は、View に関係のないロジックを分離し、ViewModel に格納することです。コードビハインドを削除する傾向も目的もありません。
  2. あなた次第です。すべての ViewModel に対して 1 つのロケーターを作成することも、1 つの ViewModel ごとに 1 つのロケーターを作成することもできます。とにかく、Locator は拡張性が低く、大規模なプロジェクトでは管理が難しいことがわかりました。ビュー、ロケーター、およびビューモデル間の依存関係を作成します。小規模なプロジェクトであっても、個人的には Locator の代わりに DI フレームワークを使用することを好みます。
  3. 要件に応じて、両方を行うことができます。(a)メインフォームのボタンをクリックしてもダイアログが表示されるだけのClick場合は、ビューに関連しているため、イベントを使用します。ロジックとは何の関係もないので、コードビハインドに保持することが私にとって最良の解決策です. (b)ちなみに、ボタンをクリックすると、たとえばデータベースに接続し、条件が true の場合にダイアログが表示されます。この場合、Messenger を使用して View と ViewModel を互いに分離します。
于 2012-12-06T07:41:34.193 に答える