1

MVVMに準拠したWPFアプリケーションを開発しています。現在、次の方法でビューのナビゲーションを処理しています。メインウィンドウ ビュー

<Border>
    <StackPanel>
    <local:Home
               Content="{Binding CurrentView,Converter={StaticResource ViewConverterHome}, UpdateSourceTrigger=PropertyChanged}"/>
    <local:Page1
            Content="{Binding CurrentView,Converter={StaticResource ViewConverterPage1}, UpdateSourceTrigger=PropertyChanged}"/>
    <local:Page2
        Content="{Binding CurrentView,Converter={StaticResource ViewConverterPage2}, UpdateSourceTrigger=PropertyChanged}"/>
    </StackPanel>

</Border>

Home、Page1、Page2 は 3 つのビューです。HomeVM、Page1VM、Page2VM は、ビューに対応するビュー モデルです。3 つのビューモデルすべての親クラスである CViewModelBase 型のプロパティ CurrentView を含むクラス呼び出し ApplicationViewModel があります。ApplicationViewModel は、次の方法でナビゲーションを処理します

   private void OnUserInputNextClicked(object sender, OperationInformationChangedEventArgs e)
    {
        do
        {
            if (this.CurrentView is HomeVM)
            {
                this.CurrentView = null;
                Page1VM page1 = new Page1VM("BNM", "MATH HONS", "13");
                page1.NextCilcked += new EventHandler<OperationInformationChangedEventArgs>(OnUserInputNextClicked);
                page1.BackCilcked += new EventHandler<OperationInformationChangedEventArgs>(OnUserInputBackClicked);
                this.CurrentView = page1;
                break;
            }

            if (this.CurrentView is Page1VM)
            {
                this.CurrentView = null;
                Page2VM page2 = new Page2VM("Kolkata", "Monoj", "Itachuna");
                page2.NextCilcked += new EventHandler<OperationInformationChangedEventArgs>(OnUserInputNextClicked);
                page2.BackCilcked += new EventHandler<OperationInformationChangedEventArgs>(OnUserInputBackClicked);
                this.CurrentView = page2;
                break;
            }
            if (this.CurrentView is Page2VM)
            {
                this.CurrentView = null;
                HomeVM home = new HomeVM("Anirban", "30");
                home.NextCilcked += new EventHandler<OperationInformationChangedEventArgs>(OnUserInputNextClicked);
                this.CurrentView = home;
                break;
            }
        } while (false);
    }

ナビゲーションは完璧に機能しています。しかし、消えたビューの破棄は呼び出されていません。そのため、すべてのビューは最後まで存続します。それを防ぐ方法はありますか?

4

4 に答える 4

4

XAML を使用して各ビューのコピーを UI に追加したため、Content含まれているビューが存在しない場合でも、ビューは常に存在します。

通常ContentControl、コンテンツ タイプごとにコントロールのインスタンスを作成する代わりに を使用してコンテンツを表示し、 を使用DataTemplatesして各タイプのコンテンツを描画する方法を WPF に指示します。

例えば、

<Window.Resources>
    <DataTemplate DataType="{x:Type local:HomeVM}">
        <local:Home Content="{Binding }" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Page1VM}">
        <local:Page1 Content="{Binding }" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Page2VM}">
        <local:Page2 Content="{Binding }" />
    </DataTemplate>
</Window.Resources>

<Border>
    <StackPanel>
        <ContentControl Content="{Binding CurrentView}" />
    </StackPanel>
</Border>

このようにContent、VisualTree には のインスタンスが 1 つしかなく、DataTemplateWPF ユーザーはそれに基づいてコンテンツの変更を描画しますDataType

完全なコード サンプルを確認することに興味がある場合は、私のブログに WPF を使用したこの種のナビゲーションの例があります。

于 2013-03-15T13:29:23.367 に答える
0

MainWindow の DataContext を変更する必要があります。それはあなたの統合に依存します。MVVM アプリケーションを作成するときは、MainWindow オブジェクトをすべてのビュー コンストラクターに渡します。そして、次のページに移動する必要があるときはいつでも (次のボタンのように)、MainWindow オブジェクトの DataContext を新しいビューに変更します。

このようなもの。

public PageOneViewModel
{

    private MainWindow _mainWindow;
    public PageOneViewModel(MainWindow mainWindow)
    {
         // Here I am saving MainWindow object.
         _mainWindow = mainWindow;
    }

    public OnNext()
    {
         // Here I am changing the view.
         MainWindow.DataContext = new PageTwoViewModel(_mainWindow);
    }
}
于 2013-03-15T06:28:35.787 に答える
0

フレームの使用を検討しましたか?

<Frame Name="YourFrame" Navigated="OnNavigated"/>

そして、あなたは呼び出すことができます

YourFrame.CanGoBack()、YourFrame.GoBack()

于 2013-03-15T06:36:44.980 に答える
0

これは、動作するソースコードを使用した同様の質問に対する私の回答へのリンクです。私が使用した手法は、Faisal のソリューションに少し似ています。

サイド メニューを使用したナビゲーションを示すダウンロード可能な優れたサンプル ソリューションが必要な場合は、こちらこちら (より単純な例)を参照してください。

于 2013-03-15T08:09:58.033 に答える