88

なぜこれ?

MainWindow.xaml:

<Window x:Class="MVVMProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <ContentControl Content="{Binding}"/>
    </Grid>
</Window>

ExampleView.xaml を次のように設定します。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vms="clr-namespace:MVVMProject.ViewModels">
    <DataTemplate DataType="{x:Type vms:ExampleVM}" >
        <Grid>
            <ActualContent/>
        </Grid>
    </DataTemplate>
</ResourceDictionary>

そして、次のようなウィンドウを作成します。

public partial class App : Application {

    protected override void OnStartup(StartupEventArgs e) {

        base.OnStartup(e);

        MainWindow app = new MainWindow();
        ExampleVM context = new ExampleVM();
        app.DataContext = context;
        app.Show();
    }
}

いつこんなことができるの?

App.xaml: (起動ウィンドウ/ビューを設定)

<Application x:Class="MVVMProject.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="ExampleView.xaml">
</Application>

ExampleView.xaml: (ResourceDictionary ではなく Window)

<Window x:Class="MVVMProject.ExampleView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vms="clr-namespace:MVVMProject.ViewModels">
    >
    <Window.DataContext>
        <vms:ExampleVM />
    </Window.DataContext>

    <Grid>
        <ActualContent/>
    </Grid>
</Window>

基本的には、「View as DataTemplate」(VaD) と「View as Window」(VaW) です。

比較についての私の理解は次のとおりです。

  • VaD: ウィンドウを閉じずにビューを切り替えることができます。(これは私のプロジェクトには望ましくありません)
  • VaD: VM はビューについてまったく何も知りませんが、VaW では、別のウィンドウを開くときに (のみ) インスタンス化できなければなりません。
  • VaW: デザイナーでレンダリングされた xaml を実際に見ることができます (少なくとも現在のセットアップでは、VaD を使用することはできません)。
  • VaW: ウィンドウの開閉を直感的に操作できます。各ウィンドウには、対応するビュー (およびビューモデル) があります。
  • VaD: ViewModel は、プロパティを介して初期ウィンドウの幅、高さ、サイズ変更可能性などを渡すことができます (VaW では、ウィンドウに直接設定されます)。
  • VaW: FocusManager.FocusedElement を設定できます (VaD での方法がわからない)
  • VaW: ウィンドウ タイプ (リボン、ダイアログなど) がビューに組み込まれているため、ファイルが少なくなります。

それで、ここで何が起こっているのですか?Windows を XAML で構築し、VM のプロパティを介してデータにクリーンにアクセスし、それで作業を完了することはできませんか? コード ビハインドは同じです (実質的にゼロ)。

すべての View のものを ResourceDictionary にシャッフルする必要がある理由を理解するのに苦労しています。

4

3 に答える 3

139

DataTemplatesビューモデルに応じてビューを動的に切り替えたい場合、人々はその方法を使用します。

<Window>
    <Window.Resources>
       <DataTemplate DataType="{x:Type local:VM1}">
          <!-- View 1 Here -->
       </DataTemplate>

       <DataTemplate DataType="{x:Type local:VM2}">
          <!-- View 2 here -->
       </DataTemplate>
    </Window.Resources>

    <ContentPresenter Content="{Binding}"/>

</Window>

そう、

Window.DataContextのインスタンスである場合はVM1View1表示されます。

で、もし

Window.DataContextのインスタンスである場合、VM2View2表示されます。

確かに、1 つのビューしか期待されておらず、変更されていない場合はまったく意味がありません。

于 2013-11-08T17:26:33.670 に答える
8

VaD では、ビュー モデルはビューについて何も知らないため、完全にビュー モデルのみで構成され、ビューを含まない、完全に機能するアプリケーションを構築できます。これにより、完全にコードで駆動できるアプリケーションを作成できるようになります。これにより、GUI を使用せずに統合テストを実行できるようになります。GUI を介した統合テストは壊れやすいことで有名ですが、ビュー モデルを介したテストはより堅牢である必要があります。

于 2014-11-04T09:17:34.620 に答える