2008-08-11 30 views
2

Je commence à apprendre à propos de la liaison dans WPF. J'ai beaucoup de mal à déboguer les erreurs d'analyse dans mon xaml, cependant. Quelqu'un peut-il me dire s'il vous plaît quel est le problème avec ce petit morceau? :Quelle est la syntaxe de liaison de valeur dans xaml?

<Border Name="TrackBackground" 
    Margin="0" 
    CornerRadius="2"      
    Grid.Row="1" 
    Grid.Column="1" 
    Background="BlanchedAlmond" 
    BorderThickness="1" 
    Height="{TemplateBinding Height}"> 

    <Canvas Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1"> 
     <Thumb Name="ThumbKnob" Height="{Binding ElementName=Part_Track, Path=Height, Mode=OneWay}" /> 
    </Canvas> 
</Border> 

C'est la liaison de données qui casse. Je reçois une exception InvalidAttributeValue pour ThumbKnob.Height lorsque j'essaie d'exécuter ceci. Je sais que je dois manquer quelque chose de fondamental. Alors remplissez-moi, gerbeurs, et ma gratitude sera sans limite.


La modification de ElementName n'a pas aidé. Il me faut autre chose que je ne reçois pas.

Je devrais mentionner que je suis en train de tester cela dans Silverlight. Le message exact que je reçois sur Internet Explorer est:

XamlParseException: Invalid attribute value for property Height.

Toute cette affaire est à l'intérieur d'un ControlTemplate. Je fais un contrôle de curseur juste pour m'enseigner les concepts.

Répondre

2

La propriété ElementName sur une liaison n'est pas pris en charge dans Silverlight.

Vous remarquerez, si vous entrez dans le code derrière ou inspectez l'objet Binding dans l'explorateur de classes, il n'a pas de propriété nommée ElementName.

+0

Juste à noter: il est dans Silverlight 4. (Et 3.5, je pense) – MojoFilter

0

Tout d'abord est une question de boîtier ...

changement

Part_Track
à
PART_Track
qui corrigera votre erreur de liaison ..

Mais je ne pense pas que ce soit ce que vous essayez de faire.

Vous pouvez utiliser une grille à la place d'une zone de dessin et le pointeur se dimensionnera automatiquement. Canvas n'a pas vraiment une hauteur, car il ne se soucie pas vraiment à la hauteur de ses enfants ...

Hope this helps ...

0

est la frontière dans un modèle btw?

Parce qu'il n'y a pas besoin de TemplateBinding si la frontière ne se trouve pas dans un modèle (soit ControlTemplate ou DataTemplate)

1

Ce que je fais habituellement DataBindings de débogage, est d'ajouter un convertisseur où je peux mettre un point d'arrêt dans VS .NET ..

si la liaison serait quelque chose comme ceci:

{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}} 

le convertisseur peut être une mise en œuvre d'un vide IValueConverter, mettre un point d'arrêt dans la méthode Convert et voir ce que la hauteur est d'être mis à ...

Ne pas oublier d'ajouter votre convertisseur à vos ressources ...

Peut-être que la valeur est NaN?

1

Hmm il pourrait y avoir une différence substantielle entre WPF en Silverlight sur ce point ..

Il me semble avoir aucun mal à ce que même si la compilation et d'exécuter cet exemple dans une fenêtre WPF:

<Slider Width="400" Height="20"> 
    <Slider.Template> 
     <ControlTemplate> 
      <Border Name="TrackBackground" 
       Margin="0" 
       CornerRadius="2"      
       Grid.Row="1" 
       Grid.Column="1" 
       Background="BlanchedAlmond" 
       BorderThickness="1"> 

       <Canvas x:Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1"> 
        <Thumb Name="ThumbKnob" Height="{Binding ElementName=PART_Track, Path=Height, Mode=OneWay}" /> 
       </Canvas> 
      </Border> 
     </ControlTemplate> 
    </Slider.Template> 
</Slider> 

Peut-être que Silverlight a moins de propriétés dans la classe Thumb ...

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.thumb.aspx

1

Ok, voici l'affaire:

En silverlight, vous ne pouvez pas lier les valeurs d'un élément d'interface utilisateur à un autre déclarative. La seule façon de faire ce que j'essayais de faire ici serait dans le code C#.

j'avais une référence pour hier, mais maintenant, je suppose que vous aurez juste à prendre ma parole :)

0

Silverlight 3 comprend désormais un caractère obligatoire ElementName ...