2011-04-28 12 views
0

そして、ガイダンスに事前に感謝します。私はMVVMには新しく、記事を通して学習してきました。私はかなり遠くに行ったと思うが、私を逃れるようなものが1つある。どのように(コードのコードを使用しないで)自動的に私が望むビューにバインドするのですか?私が理解しているように、正しく行われれば、これはパターンがどのように機能すべきかです。私はこれをすべてメインウィンドウxamlのコードの背後にあるコードを使って行うことができます。また、リソース辞書を正しく作成しました(私は直接ウィンドウでアクセスできます)。私は、自動化の次のステップには到達できません。 '私はこのパターンに慣れていないので、私はこれがすべて間違っている可能性を完全に受け入れています。ここに私が持っているものは...MVVM - ビューモデルをビューにバインドするには

私はメインウィンドウを持っています。 3行のグリッドです。一番上の行はメニューです。一番下の行はステータスバーです。中央は、メニュー選択に基づいて内容が動的にロードされるスタックパネルです。

私は、このスタックパネルを埋めるために私が使用している2つのビューがあります。その中にはスタイル付きのテキストボックス以上のものはありません(ヘルプ&について)。もう1つはコンポジットビューです。検索パネル、結果グリッド、詳細パネルはすべてドックマネージャフレームにロードされます。

メインウィンドウのコードでは、ユーザーがメニューオプションをクリックすると、スタックパネルの子をクリアし、ビューモデルをインスタンス化し、ビューモデルを渡してビューをインスタンス化してから、スタックの子供たち。これは正常に動作しますが、パターンと一貫しているとは思いません。

私はリソースディクショナリを持っていますが、スタックパネルと関連付ける方法はわかりません。バインディングを使用する必要があると仮定しますが、リソースディクショナリにバインドする方法や、コマンドでビューを変更するように指示する方法はわかりません。

利用可能なすべてのビューモデルを読み込み専用リストに読み込んだビューモデルは、基本的にメインウィジェットと必要な実際のビューモデルの間で機能します。これは問題ないと思われますが、なぜリソース辞書が必要なのか分かりません。さらに、これらの例はウィザードの実装であり、このシナリオでは良いアプローチのように思えますが、100個のビューモデルを持つアプリケーションではこれを行うことはできません。

もう一度、私の無知には申し訳ありませんが、私は誰かが正しい方向に私を向けることを望んでいました。私が言ったように、私は数多くの記事(ジョシュ・スミス、デイヴ・ヒルなど)を読みましたが、まだ接続していないので、具体的なガイダンスを期待していました。 (私は途中でWPF Unleashedを持っていますが、その前にいくつかの進歩を遂げたいと思っていました)

誰でも助けてもらえますか?

+0

これに完全に回答する時間はありませんが、これが始まることがあります。リソースディクショナリでは、ViewModelタイプのデフォルトビューを設定できます。次に、ViewModelのインスタンスをItemPresenterの何らかの種類のコンテンツにドロップすると、そのデフォルトのインスタンスが使用され、ViewModelの正しいビューが魔方陣で表示されます。次に、リージョンを持つウィンドウを作成するか、リージョンマネージャを使用してリージョンを塗りつぶすだけです。ここをクリックしてくださいhttp://stackoverflow.com/questions/5767759/changing-between-views-using-mvvm-light/5769233#5769233 –

+0

私は理解していると思いますが、確かに確かめることができますか?リソースディクショナリは、特定のビューとビューモデルを関連付けるための簡単な方法です。しかしそれにもかかわらず、どのような方法でもこれを行うことを選択した場合、「このイベントが発生すると、既存のコンテンツをクリアしてこの新しいコンテンツを追加する」というコードが必要です。それですか?あなたのリージョンマネージャなど、コンテンツの切り替えを処理するためのより良い方法があるようです。私が混乱していたのは、「...コードがない...」と読むときだったと思いました。これは、コンテンツ切り替えコードが存在しないことを意味していたと思いました。 – panania

答えて

0

私はWPFを使用していませんが、私はSilverlightを使用しましたが、それはほぼ同じであるはずです。

ビューを作成するときに、ビュー内に必要なViewModelをインスタンス化しました。私はDependency InjectionにMEFを使用し、必要なVMをそのように作成します。そのルートを下りたくないかもしれませんが、それはあなたにアイデアを与えることができます。

ViewModelに:

[Export] // This attribute tells MEF to export an instance of this class 
public class MyViewModel 
{ ... } 

ビュー

[Import] // MEF will look for any exported objects of type MyViewModel 
public MyViewModel ViewModel 
{ 
    get { return this.DataContext as MyViewModel; } 
    set { this.DataContext = value; } 
} 

この方法では自分のVを作成して、VMをインスタンス化し、それが自分のDataContextだ設定に関することに注意してみましょう、あなたのVMとあなたのVをインスタンス化し保存します。

+0

右。私は似たようなことをした。ありがとう、しかし、私の質問は、J Tranaが上でコメントしたもののラインに沿ったものでした。基本的に、コードなしでコンテンツをどのように切り替えるのですか?そして、私が読んだことに基づいて、あなたはそうしないと思います。 – panania

+0

MEFなしでインポート/エクスポートを行う方法はありますか? –

+0

@JelleCapenberghs実際のインポート/エクスポート属性はMEF固有ですが、別のDependency Injectionフレームワークを使用することも、独自のインポート/エクスポート属性を記述してインスタンス化する適切なタイプを見つけることもできます – Fermin

3

ビューモデルをバインドする方法があります。

1. XAMLに静的リソースを作成します。ビューのコンストラクタ

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <local:MainViewModel x:Key="MainVM" /> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource MainVM}"> 

    </Grid> 
</Window> 

2.バインドは、私はあなたの背後にあるコードを使用していない言及知っているが、これもオプションです。あなたがその背後にあるコードにロジックを書かない限り、あなたは良いです。 ViewModelLocator

使用

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new MainViewModel(); 
} 

3.バインドは、あなたはそれが必要であるとのviewmodelあなたのビューを与えることを担当するビューモデルロケータクラスを作成することもできます。

ここでは、viewmodelロケータクラスの簡単な例を示します。 viewmodelロケータクラスは、いくつかのviewmodelプロパティを公開します。その後、これらのプロパティをビューのデータコンテキストにバインドします。

public class ViewModelLocator 
    { 
    public ViewModelLocator() 
    { 
     this.MainVM = new MainViewModel(); 
     this.AnotherVM = new AnotherViewModel(); 
    } 
    public MainViewModel MainVM { get; set; } 
    public AnotherViewModel AnotherVM { get; set; } 
    } 

その後、アプリ内のすべてのビューにそれを利用できるようにするApp.xaml内のviewmodelロケータの静的リソースを作成することができます。

<Application x:Class="WpfApplication2.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication2" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <local:ViewModelLocator x:Key="Locator" />   
    </Application.Resources> 
</Application> 

次に、ビューのデータコンテキストをビューモデルロケータのプロパティにバインドできます。

この例では、MainViewModelインスタンスであるviewmodelロケータがWindowのデータコンテキストにバインドされている場合、MainVMプロパティをバインドしていることがわかります。

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding MainVM, Source={StaticResource Locator}}"> 
関連する問題