8

私は、Windowsフォームのバックグラウンドから来たMVVMパターン(C#)を学習しようとしています。私はMVVMLightツールキットを使用していますが、これまでのところ素晴らしいと思います。私はいくつかの小さなアプリケーションを作成しましたが、私が苦労していることの1つは、2番目のビューを導入することです。

たとえば、MainViewModelにボタンを設定します。このボタンは、RelayCommandを介して、新しいウィンドウを開きます。たとえば、「About」ウィンドウを開きます。私はこれについてWebで何時間も調査しましたが、AboutViewModelがAboutViewと通信したり表示したりすることができないようです。

AboutView.xamlの分離コードコンストラクターに受信メッセンジャーを配置しましたが、AboutViewModelからメッセージを受信するように取得できないため、「Show()」にすることはできません。

誰かが複数のビューを使用するMvvmLightWPFアプリの例を持っているならそれは素晴らしいでしょう:)

4

2 に答える 2

3

これを簡単に行うには2つの方法があります

Popup1つ目は、newの代わりにを使用することWindowです。たとえば、私はしばしばプロパティをViewModelforPopupContentとに入れ、コントロールIsPopupVisibleを表示したいときはいつでもそれらの値を設定します。Popupたとえば、ShowAboutPopuprelayコマンドは次のように実行されます。

void ShowAboutPopup()
{
    PopupContent = new AboutViewModel();
    IsPopupVisible = true;
}

Popupオブジェクトまたはカスタムを使用して表示できますUserControl。私は自分のカスタムポップアップUserControlを使用することを好みます。これは通常、次のようになります。

<Window>
    <Canvas x:Name="RootPanel">
        <SomePanel>
            <!-- Regular content goes here -->
        </SomePanel>

        <local:PopupPanel Content="{Binding PopupContent}"
            local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"
            local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" />
    </Canvas>
</Window>

PopupContentプロパティは(ViewModelなどAboutViewModel)であり、DataTemplatesWPFに特定ViewModelsの特定の描画を指示するために使用されますViews

<Window.Resources>
    <DataTemplate DataType="{x:Type local:AboutViewModel}">
        <local:AboutView />
    </DataTemplate>
</Window.Resources>

もう1つの方法はApplicationViewModel、起動時に実行されるようなものを用意し、開いているウィンドウを含むアプリケーション全体の状態を管理する方法です。

通常、私は現在のページを表示するためにApplicationViewを含むシングルを持っていることを好みますContentControl

<Window>
    <ContentControl Content="{Binding CurrentViewModel}" />
</Window>

ただし、複数のウィンドウを管理するためにも使用できます。複数のオブジェクトを管理するために使用する場合は、一部のビュー固有のオブジェクトにアクセスする必要があるため、これWindowは純粋ではないことに注意してViewModelください。UIオブジェクトを参照することは、すべきことではありViewModelません。たとえば、メッセージの受信をサブスクライブし、ShowWindowそれらのメッセージを受信すると、指定されたビューを作成して表示し、場合によっては現在のウィンドウも非表示にします。

個人的には、複数のウィンドウはできるだけ避けようとしています。私の通常の方法は、任意のページの一貫したアプリケーションオブジェクトを含む単一のビューと、ContentControl変更される動的コンテンツを含むことです。興味があれば、ブログにこのナビゲーションスタイルを使用した例があります。

于 2012-08-22T13:09:16.027 に答える
0

ご覧のとおり、MVVMアプリでナビゲーションが必要ですか?

MVVM Light-Laurent Bugnionの作成者に、切り替えにナビゲーション サービスを使用することについての彼の投稿が届きました。実際にはWindows PhoneSilverlightに関するものですが、同じことがWPFにも当てはまります。Views

また、関連する質問のこの回答は、このアプローチを使用しています。

于 2012-08-21T21:06:19.133 に答える