2009-06-11 10 views
5

ViewModelをビューに接続する方法は2つあります。 1つはXAMLにあり、もう1つは依存関係の後ろにあるコードに依存しています。ViewModelをSilverlightのビューにフックアップ

どの方法がより好ましいですか?コードの中にコードを入れたくないので、私はxamlメソッドが好きですが、もう一方のコードに問題はありますか?

<navigation:Page x:Class="MyNamespace.MyViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModel="clr-namespace:MyNameSpace.MyViewModel" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    Title="ViewModel Page" > 

    <navigation:Page.Resources> 
     <ViewModel:MyViewModel x:Key="ViewModel"></ViewModel:MyViewModel> 
    </navigation:Page.Resources> 

    <Grid x:Name="LayoutRoot" Background="White" 
      DataContext="{StaticResource ViewModel}"> 

    </Grid> 
</navigation:Page> 

OR

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 

namespace MyNamespace 
{ 
    public partial class MyView : Page 
    { 
     public MyView() 
     { 
      InitializeComponent(MyViewModel viewModel); 

      this.DataContext = viewModel; 
     } 
    } 
} 

答えて

3

ショーンは、最初にView or ViewModelに投稿しています。 VMをXAMLに入れておくとBlendのサンプルデータが見やすくなりますが、価格は情報をビューに戻す必要があります。このような理由から、John Papaはこのアプローチから離れました。

私はShawn's Marriageのアイデアを使用しています(上記のリンクを参照)。

HTH -Erik

+0

Hmm ..リンクに感謝します。私は今それを読んでいる。私は何かを取得していないので、私はそれをもう一度読む必要があると思う。ショーン氏は、「これらの方法の両方で、私はビュー・モデルへのビューの粘着性が気に入らない傾向があります。また、これらは両方とも、通常のケースでは常にケースではない1対1の関係を示唆しています" View-Firstでは、多くのビューを1つのVMにデータバインドすることができます。 1つのビューを複数のVMにバインドできますか?うーん..もう一度、あなたのVが単純なグリッドであれば、別のVMにバインドさせたいかもしれないと思います。 –

+0

これまでのところ、私はVとVMの間に1対1の関係を維持するファンです。それは私が階層に反対していることを意味しません。つまり、ビューにはそれぞれ独自のVMを持つサブビューが含まれている可能性があり、これはかなりうまく機能しているようです。 –

+0

私たちのアプリケーションでは、データの行だけを表示する標準のグリッドビューがあります。そのデータは異なるViewModelからのものであるため、1対1にしておくことは意味がありません。含まれているデータを除き、すべて同じである場合、複数のグリッドビューを持つ必要はありません。 –

0

あなたはここでそれをした方法、私はXAMLとなるだろう。 DataContextプロパティに設定する方法は他にもあります。興味があれば、WPF用のMicrosoft CAGフレームワークを見てください。

0

これは、ビューのテストが非常に簡単に作るので、私はコード内でVMを設定しました。ジャスティン・エンジェルは、このための偉大なポストを持っている:

public partial class Page : UserControl 
{ 
    private PageViewModel _viewModel = new PageViewModel(); 

    public PageViewModel ViewModel 
    { 
     get { return _viewModel; } 
     set { _viewModel = value; } 
    } 

    public Page() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Page_Loaded); 
    } 

    void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = ViewModel; 
    } 

} 

私はMVVMパターンを囲むテストのintricasiesについて学ぶために非常に有用であることが彼のポストを見つけました。私はMVVMのトライアドを扱う「画面」をダビングクラスを使用し

http://silverlight.net/blogs/justinangel/archive/2009/02/25/silverlight-unit-testing-rhinomocks-unity-and-resharper.aspx

+0

リンクをありがとう。私はまだそれを今読んでいるが、私は今ショーンの方法を好む。私はもう少し時間をかけて考える必要がありますが、私はVMとVをはっきりと切り離したいと思います。 –

4

。私はVをVMに注入してから、VMをVのリソースとして使い始めましたが、結局のところ画面のコンセプトは私のためには最高でした。それは私がお互いに結合されていないVとVMを使用することができます。また、私の全体的なプレゼンテーションフレームワークで他の機能を抽象化します。ここに私の画面クラスのコンストラクタは、一例として、次のとおりです。VMが画面内に作成され

public CatalogItemScreen(IUnityContainer container) : base(container) 
    { 
     this.ViewModel = Container.Resolve<ICatalogItemViewModel>(); 
     this.View = Container.Resolve<CatalogItemView>(); 
     this.View.DataContext = this.ViewModel; 
    } 

お知らせ、Vは、ここで作成され、そして2は互いに結合しています。このサンプルでは、​​UnityとPrismを使用していますが、これを行う必要はありません。

関連する問題