Question

J'apprends tout sur la liaison dans WPF.J'ai cependant beaucoup de mal à déboguer les erreurs d'analyse dans mon XAML.Quelqu'un peut-il me dire ce qui ne va pas avec ce petit morceau ?:

<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 se rompt.je reçois un InvalidAttributeValue exception pour ThumbKnob.Height lorsque j'essaie de l'exécuter.Je sais qu'il me manque quelque chose de fondamental.Alors remplissez-moi, stackers, et ma gratitude sera sans limites.


Changer le ElementName n'a pas aidé.Il doit y avoir autre chose que je ne comprends pas.

Je dois mentionner que je teste cela dans Silverlight.Le message exact que je reçois d'Internet Explorer est le suivant :

XamlParseException: Invalid attribute value for property Height.

Tout cela se trouve dans un ControlTemplate.Je crée un contrôle de curseur juste pour m'apprendre les concepts.

Était-ce utile?

La solution

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

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

Autres conseils

Ce que je fais habituellement pour déboguer les liaisons de données, c'est ajouter un convertisseur où je peux définir un point d'arrêt dans VS.NET.

donc la liaison ressemblerait à ceci :

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

Ensuite, le convertisseur peut être une implémentation vide d'un IValueConverter, définir un point d'arrêt dans la méthode Convert et voir à quoi la hauteur est définie...

N'oubliez pas d'ajouter votre convertisseur à vos ressources...

Peut-être que la valeur est NaN ?

Ok, voici le deal :

Dans Silverlight, vous ne pouvez pas lier les valeurs d'un élément de l'interface utilisateur à un autre de manière déclarative.La seule façon de faire ce que j’essayais de faire ici serait d’utiliser le code C#.

J'avais une référence à ce sujet hier, mais maintenant je suppose que vous devrez simplement me croire sur parole :)

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

Il me semble que je n'ai aucun problème à compiler et 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

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

Changement

Part_Track
à
PART_Track
ce 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 au lieu d'un canevas, et le pouce se redimensionnera automatiquement.La toile n'a pas vraiment de hauteur, car elle ne se soucie pas vraiment de la taille de ses enfants...

J'espère que cela t'aides...

La bordure est-elle dans un modèle ?

Parce qu'il n'est pas nécessaire de TemplateBinding si la bordure n'est pas située dans un modèle (soit ControlTemplate, soit DataTemplate)

Silverlight 3 inclut désormais la liaison ElementName...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top