MVVMパターンを使用すると、DataContextを特定のViewModelに設定します。今、XAMLにDataContextの型を伝え、バインディングを検証する方法はありますか?WPF/XAMLで厳密に型指定されたバインディングを取得できますか?
ASP.NET MVCでタイプされたビューデータのようなものを探しています。
あなたは、各個人が強く型付けされた方法で結合書くことができますMVVMパターンを使用すると、DataContextを特定のViewModelに設定します。今、XAMLにDataContextの型を伝え、バインディングを検証する方法はありますか?WPF/XAMLで厳密に型指定されたバインディングを取得できますか?
ASP.NET MVCでタイプされたビューデータのようなものを探しています。
あなたは、各個人が強く型付けされた方法で結合書くことができますいいえ、現在の仕様にはXamlでは厳密な型指定がありません。 .NET 4.0では、Xamlはジェネリックのための容量を見なければならないと思う。これで、Xamlでの厳密な型指定がはるかに簡単になるはずです。
:
<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" />
は、しかし、これはテキストボックスのDataContextのタイプがViewModel.Siteであるという事実を検証しません(と私はこれが不可能であると思いますが、私は間違っているかもしれない)。
これを試してみてください:
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" />
</Window>
私はこのコードをテストしていませんが、それはあなたのアイデアを与える必要があります。コンテンツプレゼンターは、DataTemplateを使用する現在のDataContextを表示します。これはコンパイラーで厳密に型指定されているわけではありませんが、ロード時に(ウィンドウのInitializeComponent内の)実行時エラーをただちにスローします。何かが壊れた場合は、テストで簡単にこれをキャッチすることができます。
FrameworkElement.DatatContext
は、データバインディングがobject
のものであることを可能にする依存性プロパティです。
他の人に指摘されているように、DataTemplate
と呼ばれる特別なテンプレートには、DataContext
の予想されるタイプを指定できます。 ItemsControl
,ControlControl
などの多くのコントロールは、DataTemplateにアクセスして、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プロパティは、通常、ControlTemplate型のControl.Templateを参照します。これは、DataTemplateとはまったく異なるものです。
ブライアンは、2つのルートコントロールタイプの1つ(ItemsControl
)の1つであるContentControl
を考えていたと思います。 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>
私は個人的に私のviewmodelの各プロパティを参照するために、この使用して、Xを静的のPropertyPathを宣言:結合パスなどの静的 - 例えば
public class MyViewModel
{
public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty");
public bool MyProperty{get; set;}
}
XAML:{Binding Path={x:Static local:MyViewModel.MyPropertyPath}}
この方法で、すべての私のバインディングはビルド時に検証されます。
.Net 3.5にはDataTemplateがありません。TargetTypeプロパティ –
@Brianそうです、DataTypeです。私はそれがテストされていないと言いました。私はエラーを修正するための答えを更新しました。 –