2012-01-12 19 views
1

私はMVVM/WPFを初めて使用し、GridコントロールとStackPanelレイアウトコントロールの使い方を知っています。依存性注入:特定のグリッドセルにユーザーコントロールを割り当てる

------------------------- 
|  Navigation  | 
------------------------- 
|   |    | 
| Summary | Details | 
|   |    | 
------------------------- 
|  Extra Data  | 
------------------------- 

レイアウトを取得したら、正しいセルに正しいビューを取得するにはどうすればよいですか。それぞれの異なる領域(ナビゲーション、要約など)には、独自のView/ViewModelがあります。

私は2つの異なる方法を考えましたが、どちらかが(もしあれば)最良であるかはわかりません。それは良い習慣であるかどうか、そのような

<Grid> 
    <Row> (Navigation) 
    <Row> 
     <Grid> 
     <Column> (Summary) 
     <Column> (Detail) 
     </Grid> 
    <Row> (Extra) 
</Grid> 

よう

方法1 埋め込まれて、グリッドは、私はわからないスパニング列を必要とします。

方法2埋め込まビュー

<Grid> 
    <Row> (Navigation) 
    <Row> (Summary/Details defined by a another view containing 2 columns) 
    <Row> (Extra) 
</Grid> 

もメソッド(または何か他のもの)のいずれかで方法2

用グリッドの代わりにのStackPanelを使用することができますどのように私は何のビューを取得し、どのようなセルを指定していますか?例えば、私はMainWindowViewModelに次き:正しい細胞内の正しいビューを指定するのItemsSourceを活用する方法が

<Window.Resources> 
    <ResourceDictionary Source="MainWindowResources.xaml" /> 
</Window.Resources> 


<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="100" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="50" /> 
    </Grid.RowDefinitions> 
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" /> 
</Grid> 

だけでわからない:

public MainWindowViewModel() 
    { 

     NavigationViewModel navigationViewModel = new NavigationViewModel(); 
     this.ViewModels.Add(navigationViewModel); 

     SummaryViewModel summaryViewModel = new SummaryViewModel(); 
     this.ViewModels.Add(summaryViewModel); 

     DetailViewModel detailViewModel= new DetailViewModel(); 
     this.ViewModels.Add(detailViewModel); 


     ExtraDataViewModel extraDataViewModel = new ExtraDataViewModel(); 
     this.ViewModels.Add(extraDataViewModel); 
    } 


     private ObservableCollection<ViewModelBase> _viewModels; 
     public ObservableCollection<ViewModelBase> ViewModels 
     { 
      get 
      { 
       if (_viewModels == null) 
       { 
        _viewModels = new ObservableCollection<ViewModelBase>(); 
       } 
       return _viewModels; 
      } 
     } 

そしてMainWindowViewで、私はこれを持っています。

答えて

1

Prismまたはは、複合UIを構築するための本当に優れたツールです。私はこの機能を自分で構築しようとはしません。


更新

あなたは別の枠組みの中で持ってしたくない場合は、私はあなただけの一般的なレイアウトのためのGridを使用してGridの細胞にItemsControlsを置くことをお勧めします。DataTemplateを使用して、ビューモデルをそれぞれのビューに接続します。

+0

私はこれをできるだけシンプルにしておきたいので、別のフレームワークをミックスに投入することを躊躇しています。レイアウトは、私が上に示したものより複雑ではなく、私は別のフレームワークが過度のものかもしれないと思います。 – BrianKE

1

最初の例のように、DockPanelやGridなどを使用してメインビューをレイアウトする方法はいくつかあります。ネストされたグリッドを使用しているため、この場合は列をまたがる必要はありませんが、とにかく列にまたがることは完全に容認されます。

ビューモデルについては、4つのサブビューモデルのそれぞれを、すべてのビューモデルのコレクションを持つのではなく、それぞれの個別のプロパティとして公開します。これにより、各サブビューをメインビューに配置しやすくなります。

Caliburn.MicroなどのMVVMフレームワークを使用すると、表示の構成が非常に簡単になります。これは、ビューからビューモデルの動詞(メソッド)を呼び出すなどの作業を大幅に簡素化します。

Prismのように、ビュー構成のソリューションを提供する他のフレームワークもあります。

+0

「4サブビューモデルを公開する」とは、ItemsSourceを「タップ」してどのビューをどのセルに指定するかを指定できないことを意味します。 MainWindowViewModelに別のObservableCollectionを追加するだけですか、それとも別の方法ですか? – BrianKE