La propriété de dépendance qui active la liaison de données est de type object
.
Comme indiqué par d'autres, vous pouvez spécifier le type attendu d'un DataContext
pour un modèle spécial appelé DataTemplate
. De nombreux contrôles tels que ItemsControl
, ControlControl
donnent accès aux DataTemplates pour vous permettre de définir les attentes de la représentation visuelle du type DataContext. Bryan a raison, il n'a pas testé son code.
L'application correcte d'un DataTemplate typé ressemble à ceci:
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" />
</Window>
ContentPresenter hérite directement de FrameworkElement et ne dispose pas d'une propriété de modèle. En outre, la propriété Template fait généralement référence à Control.Template de type ControlTemplate, qui est quelque chose de complètement différent d'un DataTemplate.
Je pense que Bryan pensait au ContentControl
qui est l'un des deux types de contrôle racine (l'autre étant ItemsControl
). ContentControl
hérite en fait de Control. Par conséquent, nous pouvons spécifier la propriété Template si nous le voulons.
<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>
.Net 3.5 n'a pas de DataTemplate.Propriété TargetType –
@Brian Vous avez raison, c'est DataType. J'ai dit que ce n'était pas testé. J'ai mis à jour la réponse pour corriger l'erreur. –