2009-03-11 5 views

答えて

3

いいえ、現在の仕様にはXamlでは厳密な型指定がありません。 .NET 4.0では、Xamlはジェネリックのための容量を見なければならないと思う。これで、Xamlでの厳密な型指定がはるかに簡単になるはずです。

3

<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" /> 

は、しかし、これはテキストボックスのDataContextのタイプがViewModel.Siteであるという事実を検証しません(と私はこれが不可能であると思いますが、私は間違っているかもしれない)。

0

これを試してみてください:

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
      ... 
     </DataTemplate> 
    </Window.Resources> 

    <ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" /> 
</Window> 

私はこのコードをテストしていませんが、それはあなたのアイデアを与える必要があります。コンテンツプレゼンターは、DataTemplateを使用する現在のDataContextを表示します。これはコンパイラーで厳密に型指定されているわけではありませんが、ロード時に(ウィンドウのInitializeComponent内の)実行時エラーをただちにスローします。何かが壊れた場合は、テストで簡単にこれをキャッチすることができます。

+0

.Net 3.5にはDataTemplateがありません。TargetTypeプロパティ –

+0

@Brianそうです、DataTypeです。私はそれがテストされていないと言いました。私はエラーを修正するための答えを更新しました。 –

2

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> 
1

私は個人的に私の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}}

この方法で、すべての私のバインディングはビルド時に検証されます。

関連する問題