2

私のWPFアプリケーションはMVVMパターンに従います。3つのビューがあります。

  • MainWindow
    • LoginView
    • ProjectsView

LoginViewおよびProjectsViewは、によってインポートされたユーザーコントロールMainWindowです。両方のビューにビューモデルが割り当てられています。Webサービスを呼び出すことによって設定されるLoginViewModelプロパティを定義します。ProjectList今、プロパティや他の人LoginViewModelにアクセスする必要があります。ProjectList

1つのソリューションが1つのビューと1つのビューモデルのみになるように再設計される可能性があることを認識しています。私はバックアップソリューションとしてそれを行いますが、そうしないことを望みます。

これはどのように行う必要がありますか?Prismのような何らかのEventAggregatorを使用する必要がありますか?または、これを行う他の方法はありますか?

4

2 に答える 2

3

したがって、明確に理解できればProjectList、「LoginViewModel」と「ProjectsViewModel」の両方からプロパティにアクセスする必要があります。「MainViewModel」に実装して、子ビューモデルが自然な方法でアクセスできるようにします。

IEventAggregator は、イベントを追加したり、イベントを見つけてサブスクライブしたりできるボックスのようなものなので、必要なものではないと思います。とにかく、カスタム インターフェイス (ボックス タイプ) を に登録できます。これにより、どこからでもアクセスできるようにUnitySingleton.Container公開されます。ProjectListこのアプローチは、個別のアセンブリであるモジュールが相互に通信する必要がある場合に非常に有効です。これがやり過ぎかどうかを判断する必要がある場合は、個人的には「メインビューモデルに入れる」オプションを使用します。

-- サンプル -- (未テスト)

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        LoginVM = new LoginViewModel(this);
        ProjectsVM = new ProjectsViewModel(this);
        RetrieveProjectList();
    }

    public LoginViewModel LoginVM { get; private set; }

    public ProjectsViewModel ProjectsVM { get; private set; }

    public object ProjectList { get; private set; }

    private void RetrieveProjectList()
    {
        ProjectList = ....
    }
}

ご覧のように非常に単純で、それらを作成した への参照LoginVMProjectsVM保持するため、へのMainViewModelアクセスが可能になりProjectListます。

于 2013-01-16T12:50:14.697 に答える
2

これはどのように行う必要がありますか?Prismのような何らかのEventAggregatorを使用する必要がありますか?または、これを行う他の方法はありますか?

ここにいくつかのアイデアがあります:

  • 両方のビューモデルが継承するビューモデルクラスを作成できます。この基本クラスには、共有プロパティが含まれます。
  • 共有プロパティを含む静的クラスを作成します。
  • 依存性注入を使用して、プロパティを含むクラスを作成し、それをコンテナにシングルトンとして登録して、ビューモデルのctorに注入します。

また、EventAggregatorモジュール/アセンブリ間の通信に最適だと思います。あなたの例では、すべてが同じアセンブリにあるように見えます。

于 2013-01-16T15:40:46.693 に答える