MVVMパターンを使用して、DataContext を特定の ViewModel に設定します。バインディングを検証するために、XAML に DataContext の型を伝える方法はありますか?
ASP.NET MVC で型指定されたビューデータのようなものを探しています。
厳密に型指定された方法で、個々のバインディングをそれぞれ記述できます。
<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" />
ただし、これは TextBox DataContext が ViewModel.Site 型であるという事実を検証しません (これは不可能だと思いますが、間違っている可能性があります)。
いいえ。FrameworkElement.DatatContext
データバインディングを有効にする依存関係プロパティは、タイプobject
です。
他の人が指摘しているように、DataContext
と呼ばれる特別なテンプレートに期待されるタイプを指定できますDataTemplate
。などの多くのコントロールはItemsControl
、ControlControl
DataTemplatesへのアクセスを提供して、DataContextのタイプに対する視覚的表現の期待を設定できるようにします。
ブライアンは正しいです、彼は彼のコードをテストしませんでした。
型指定されたDataTemplateの正しいアプリケーションは、次のようになります。
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" />
</Window>
ContentPresenterはFrameworkElementから直接継承し、Templateプロパティを持っていません。さらに、Templateプロパティは通常、DataTemplateとはまったく異なるタイプControlTemplateのControl.Templateを参照します。
ContentControl
ブライアンは、2つのルートコントロールタイプの1つ(もう1つは)を考えていたと思いますItemsControl
。ContentControl
実際には、コントロールから継承します。したがって、必要に応じて、そのテンプレートプロパティを指定できます。
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
<ControlTemplate x:Key="ControlSkin" TargetType="{x:Type ContentControl}">
...
</ControlTemplate>
</Window.Resources>
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" Template="{StaticResource ControlSkin}" />
</Window>
いいえ、現在の仕様では、Xaml に厳密な型指定はありません。.Net 4.0 では、Xaml でジェネリックの容量が表示されるはずです。これで、Xaml で強力な型付けを行う方がはるかに簡単になるはずだと思います。
ビューモデルの各プロパティの静的 PropertyPath を個人的に宣言し、バインディング パスとして x:static を使用してこれを参照します。
public class MyViewModel
{
public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty");
public bool MyProperty{get; set;}
}
xaml:{Binding Path={x:Static local:MyViewModel.MyPropertyPath}}
このようにして、ビルド時にすべてのバインディングが検証されます。
これを試して:
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" />
</Window>
私はこのコードをテストしていませんが、アイデアが得られるはずです。コンテンツ プレゼンターは、DataTemplate を使用する現在の DataContext を表示します。これはコンパイラで厳密に型指定されていませんが、読み込み時にすぐに実行時エラーをスローします (ウィンドウの InitializeComponent 内)。何かが壊れた場合、テストでこれを簡単にキャッチできるはずです。