1

MVVMパターンで苦労していることの1つは、追加のWindowsを実装しようとしたときです。特定の目的に役立つウィンドウに合わせて追加のウィンドウとViewModelを作成すると、デザインが失われるように見えます。

たとえば、私は非常に単純なアプリケーションを持っています。追加/削除/復元できる人のリストです。私の最初のデザインはViewModelからの削除/復元を処理しますが、追加はユーザーに情報を要求する必要があります。これを考慮して、新しいWindowとViewModel(AddWindow / AddViewModel)を作成しました。この時点で私は道に迷います。間で通信するコントローラーの作成について読んだことがありますが、それが理にかなっているのかどうかさえわかりません。

AddWindowで、ユーザーは2つのフィールド(名/姓)に入力してから[追加](またはキャンセル)をクリックできます。その場合、データをViewModelに戻して、コレクションに追加できるようにする必要があります。更新されます(AddWindowも閉じる必要があります)。

どうすればこれをより良い方法で考えることができ、そのような単純な問題を解決するためにここで何ができるでしょうか?

4

2 に答える 2

1

どうすればこれをより良い方法で考えることができ、そのような単純な問題を解決するためにここで何ができるでしょうか?

シンプルに保つようにしてください。ビュー/ビューモデルの組み合わせを不必要に追加しないでください。あなたの場合、可能であれば、既存のビューに追加機能を配置します。たぶん、ビュー/ビューモデルの名前を「ManageThisView」/「ManageThisViewModel」のようなより一般的なものに変更できますか?これで、関連する関数のグループを管理する1つのスタックができました。

コントロールの表示を切り替えるか、スペースを節約するコントロールを使用して、ビューをクリエイティブにするようにしてください。ビューが直感的である限り、ユーザーは多くのフォームナビゲーションを必要とするスキームよりもビューを好むかもしれません。

あまりにも多くの「スーパー」ビュー/ビューモデルを作成することをお勧めしませんが、関連する機能をグループ化し、クラスの数を合理化することを検討してください。

より多くのクラスを作成し、Prismのようなフレームワークを使用する時間はありますが、あなたのクラスは適切な候補ではないようです。

于 2013-01-15T18:55:27.967 に答える
1

すべてのユーザーデータを保持する新しいクラスApplicationModelを作成します。「メイン」ビューモデルで作成してから、プロパティに保持する必要があります。ビューは、モデル内のデータへのフルパスにバインドする必要があります。

<DataGrid ItemsSource="{Binding Path=Model.ListOfThingsToDo, Mode=OneWay}" ... />

新しいViewModelのコンストラクターで、そのモデルをパラメーターとして指定します。そうすれば、すべてのViewModelが同じモデルを共有し、新しいViewModelが「メイン」のViewModelと同じデータを変更/表示できます。

/// <summary>
/// ViewModel for the Main Window
/// </summary>
class MainViewModel
{
    public ApplicationModel Model { get; set; }

    public MainViewModel()
    {
        Model = new ApplicationModel();
        Model.ListOfThingsToDo.Add("Clean the yard");
        Model.ListOfThingsToDo.Add("Walk dog");
    }

    // Some method that will be called when you want to open another window
    public void OpenTheWindow()
    {
        var modalViewModel = new NewTaskViewModel(Model);
        // Create an instance of your new Window and show it. 
        var win = new NewTaskWindow(modalViewModel);
        win.ShowDialog();
    }
}

/// <summary>
/// Model to hold the data
/// </summary>
class ApplicationModel
{
    public ObservableCollection<string> ListOfThingsToDo { get; set; }
    public ApplicationModel()
    {
        ListOfThingsToDo = new ObservableCollection<string>();
    }
}


/// <summary>
/// ViewModel to handle adding new things to do
/// </summary>
class NewTaskViewModel
{
    public ApplicationModel Model { get; set; }

    public NewTaskViewModel(ApplicationModel model)
    {
        Model = model;
    }

    // Add methods here that will be called to add tasks to the Model.ListOfThingsToDo
    public void AddTask()
    {
        Model.ListOfThingsToDo.Add("the new task to do");
    }
}
于 2013-01-15T18:56:27.750 に答える