2009-03-11 6 views

Répondre

3

Non, la spécification actuelle n'a pas de typage fort dans Xaml. Je crois qu'avec .Net 4.0, Xaml devrait voir la capacité pour les génériques. Avec cela, je pense qu'il devrait être beaucoup plus facile d'avoir une forte dactylographie dans Xaml.

3

Vous pouvez écrire chaque individu se lier d'une manière fortement typée:

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

Toutefois, ce ne serait pas valider le fait que TextBox DataContext est de type ViewModel.Site (et je pense que cela est impossible, mais J'ai peut-être tort).

0

Essayez ceci:

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

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

Je ne l'ai pas testé ce code, mais il devrait vous donner l'idée. Le présentateur de contenu affichera le DataContext actuel qui utilisera le DataTemplate. Ceci n'est pas fortement typé dans le compilateur mais lancera une erreur d'exécution immédiatement sur load (dans InitializeComponent de la fenêtre). Vous devriez être capable d'attraper ceci facilement dans vos tests si quelque chose casse.

+0

.Net 3.5 n'a pas de DataTemplate.Propriété TargetType –

+0

@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. –

2

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

Je déclare personnellement PropertyPath statique pour chaque propriété dans mon viewmodel la référence cela en utilisant x: statique comme le chemin de liaison - par exemple

public class MyViewModel 
{ 
    public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty"); 
    public bool MyProperty{get; set;} 
} 

XAML: {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}

De cette façon, tous les mes liaisons sont validées lors de la construction.

Questions connexes