16

MVVMパターンを使用して、DataContext を特定の ViewModel に設定します。バインディングを検証するために、XAML に DataContext の型を伝える方法はありますか?

ASP.NET MVC で型指定されたビューデータのようなものを探しています。

4

5 に答える 5

4

厳密に型指定された方法で、個々のバインディングをそれぞれ記述できます。

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

ただし、これは TextBox DataContext が ViewModel.Site 型であるという事実を検証しません (これは不可能だと思いますが、間違っている可能性があります)。

于 2009-03-11T07:59:12.897 に答える
3

いいえ。FrameworkElement.DatatContextデータバインディングを有効にする依存関係プロパティは、タイプobjectです。

他の人が指摘しているように、DataContextと呼ばれる特別なテンプレートに期待されるタイプを指定できますDataTemplate。などの多くのコントロールはItemsControlControlControlDataTemplatesへのアクセスを提供して、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つは)を考えていたと思いますItemsControlContentControl実際には、コントロールから継承します。したがって、必要に応じて、そのテンプレートプロパティを指定できます。

<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>
于 2009-03-20T04:34:21.567 に答える
3

いいえ、現在の仕様では、Xaml に厳密な型指定はありません。.Net 4.0 では、Xaml でジェネリックの容量が表示されるはずです。これで、Xaml で強力な型付けを行う方がはるかに簡単になるはずだと思います。

于 2009-03-14T04:25:03.250 に答える
2

ビューモデルの各プロパティの静的 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}}

このようにして、ビルド時にすべてのバインディングが検証されます。

于 2010-10-15T09:35:19.393 に答える
1

これを試して:

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

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

私はこのコードをテストしていませんが、アイデアが得られるはずです。コンテンツ プレゼンターは、DataTemplate を使用する現在の DataContext を表示します。これはコンパイラで厳密に型指定されていませんが、読み込み時にすぐに実行時エラーをスローします (ウィンドウの InitializeComponent 内)。何かが壊れた場合、テストでこれを簡単にキャッチできるはずです。

于 2009-03-11T13:41:44.620 に答える