2012-01-21 21 views
0

データベースクエストを追加、検索、削除、および更新する4つのボタンがあるウィンドウがあります。実行時にWPFウィンドウのコンテンツを変更する方法

これらのボタンの1つをクリックすると、これらの機能のための特定のWPFコントロールを備えた新しいウィンドウが開きます。

どうすれば新しいウィンドウを開くことなくこれを行うことができますか?すべてが1つのウィンドウで実行され、WPFコントロールのみが変更され、コードが無効になります。 「戻る」または「実行」をクリックした後、メインウィンドウに戻りたいと思います。

+0

アイデアを得るためにMVVMに関する記事を読んでください。 –

+0

このようにして投稿を改ざんしないでください。 –

答えて

6

キーがContentControlです - あなたは、その内容を変更されます。

<ContentControl Content="{Binding WhatToShow}"/> 

とあなたのビューモデルでは、プロパティobject WhatToShowを持つことになります。

if(some_condition) 
    WhatToShow = new SomeView(someViewModel); 
else 
    WhatToShow = new AnotherView(anotherViewModel); 

MVVMフレームワークのCaliburn.Microは、画面のナビゲーションを容易にします。

+0

バインディングを使用するための+1 – Mzn

+0

初心者の質問に申し訳ありませんが、私の知識はクラスとデータバインディングで停止します。私のView Modelは何ですか? – slopsucker

+0

ビューモデルはビューについて何も知らない。したがって、操作WhatToShow = viewmodelの新しいSomeView(someViewModel)はMVVMに対応していません。ビューモデルでのみ操作する必要があります。 –

0

ウィンドウの代わりに、操作ごとにグリッドを作成します。そして、そのグリッド内で、その特定のコントロールを配置します。すべてのグリッドのVisibilityをVisibility.Collapsedに設定します。誰かがボタンの1つを押すと、関連するグリッドのVisibilityをVisibility.Visibleに設定し、もう1つを折りたたむように設定します。 これは、非常に使いやすいUserControlsを使用するように構成されているということです。 XAMLをそこに追加してメインウィンドウに追加するだけです。私が以前言ったように隠して見せてください。

+0

これは私の最初の計画でしたが、3〜4個のマスクの後では、これはXAMLに非常に多くのグリッドがあり、それを非表示または表示するように整理されているとは思いません。 Karelが私に印象づけてくれた方法ですが、その実装方法はわかりません。 – slopsucker

0

私は次のアプローチをrecomentたい:

  1. はあなたのビューにTabControlのを置く - のTabControlタブヘッダ(how to hide tab control headers?を)隠しTabControlのためのスタイルを適用
  2. 異なるビュー間の 切り替えのために使用されます
  3. 切り替えられるすべてのビューのビューモデルを準備します。たとえば、 ViewModel1、ViewModel2。
  4. すべての切り替えビューモデルを集約するメインビューモデルを準備します。タブコントロールに

    public class MainViewModel : INotifyPropertyChanged 
    
        { 
    
         private ViewModel1 _viewModel1 = new ViewModel1(); 
    
         private ViewModel2 _viewModel2 = new ViewModel2(); 
    
         private INotifyPropertyChanged _currentViewModel; 
         public INotifyPropertyChanged CurrentViewModel 
         { 
          get { return _currentViewModel; } 
          set 
          { 
           _currentViewModel = value; 
           RaisePropertyChanged(() => CurrentViewModel); 
          } 
          } 
    
          public IEnumerable<INotifyPropertyChanged> ViewModelsToSwitch 
          { 
           get 
           { 
            return new INotifyPropertyChanged[] 
               { 
                _viewModel1, 
                _viewModel2 
               }; 
           } 
          } 
    
         // INotifyPropertyChanged implementation 
    

    }

  5. バインドMainViewModel:

<Window x:Class="SwitchViewDemo.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Title="MainWindow" Height="350" Width="525"> 
     <Grid> 
      <TabControl ItemsSource="{Binding ViewModelsToSwitch}" 
         SelectedItem="{Binding CurrentViewModel}"/> 
     </Grid> 
    </Window> 

6。

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type ViewModel1}"> 
      <TextBlock Text="View 1"/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ViewModel2}"> 
      <TextBlock Text="View 2"/> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <TabControl ItemsSource="{Binding ViewModelsToSwitch}" 
        SelectedItem="{Binding CurrentViewModel}"/> 
    </Grid> 
</Window> 

7:各ビューモデルのビューを宣言する。 MainViewModelに設定されているCurrentViewModelをViewModel1またはViewModel2に設定し、このビューモデルビューに関連付けられたビューが表示されます。

利点:

  • MVVMパターンに対応する - あなたはすべてのMVVM benefits
  • 良いスケーリングを得るようにします。新しいViewModel3を追加する場合は、このビューモデルをメインビューモデルに追加し、指定されたビューでビューモデルのマッピングを宣言するAddional DataTemplateを作成するだけです。
+0

2つのビューを実装するサンプルプロジェクトがありますか?私はそれを働かせない:( – slopsucker

関連する問題