[解決済み] WPF MVVM XAML Window Viewsではなく、ContentControl + DataTemplate Viewsを使用する理由とは?
2023-04-06 01:13:48
疑問点
なぜこのようなことをするのですか?
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) vs. "View as Window" (VaW)です。
以下は、この比較に関する私の理解です。
- VaD: ウィンドウを閉じることなくビューを切り替えることができます。(これは私のプロジェクトでは望ましくありません)
- VaD: VM はビューについてまったく何も知らないが、VaW では別のウィンドウを開くときにインスタンス化できる必要がある (のみ)。
- VaW: Designer でレンダリングされた xaml を実際に見ることができる (VaD ではできない)。 VaD では、少なくとも私の現在のセットアップでは、できません)。
- VaW: 直感的に操作できる。 各ウィンドウは対応する View(および ViewModel)を持っています。 (および ViewModel) を持ちます。
- VaD: ViewModel はプロパティを通してウィンドウの初期幅、高さ、リサイズ性などを渡すことができる (VaW ではそれらは直接 Window に設定される)。
- VaW: FocusManager.FocusedElement を設定できる (VaD では方法は不明)。
- VaW: ウィンドウ タイプ (例: リボン、ダイアログ) がビューに組み込まれているため、ファイル数が少なくなる。
では、ここで何が起こっているのでしょうか。 XAML でウィンドウを構築し、VM のプロパティを通じてデータにきれいにアクセスし、それで完了することはできないのでしょうか? コード ビハインドも同じです (事実上ゼロです)。
なぜすべてのビューのものを ResourceDictionary にシャッフルしなければならないのか、理解に苦しんでいます。
どのように解決するのですか?
人々は
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
のインスタンスであれば
VM1
であれば
View1
が表示されます。
と表示され、もし
Window.DataContext
のインスタンスである場合
VM2
であれば
View2
が表示されます。
もし、1つのViewだけが期待され、決して変更されないとしたら、それは全く意味がありません。
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] 関数を終了するには?
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み】なぜFunc<T>ではなくExpression<Func<T>を使うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である