La liaison en WPF style causes inexplicable “Impossible de trouver le conseil d'FrameworkElement” erreur
J'ai un ItemsControl
qui affiche un tas de rectangles. Chaque rectangle doit être décalé vers le haut et vers la gauche. Donc, j'ai créé un RectangleStyle
qui utilise les fixations pour définir la largeur, la hauteur X de la traduction, et Y traduction d'un rectangle.
La largeur et la hauteur des liaisons fonctionnent très bien, mais j'obtiens l'erreur suivante pour la TranslateTransform
les liaisons:
Système.De Windows.Erreur de données: 2 : Impossible de trouver des gouverneurs FrameworkElement ou FrameworkContentElement pour l'élément cible. BindingExpression:Path=Offset.X; DataItem=null; élément cible est "TranslateTransform' (HashCode=16452547); la propriété cible est " X "(de type "Double")
Voici la définition de mon ItemControl
:
<ItemsControl
Style="{StaticResource ItemsControlStyle}"
ItemsSource="{Binding Zones}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Style="{StaticResource RectangleStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Voici la définition de ItemsControlStyle
:
<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Point.X}" />
<Setter Property="Canvas.Top" Value="{Binding Point.Y}" />
</Style>
</Setter.Value>
</Setter>
</Style>
Et voici la définition de RectangleStyle
:
<Style x:Key="RectangleStyle" TargetType="Rectangle">
<Setter Property="Width" Value="{Binding Size.Width}" />
<Setter Property="Height" Value="{Binding Size.Height}" />
<Setter Property="RenderTransform">
<Setter.Value>
<!-- these bindings are causing the error -->
<TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
</Setter.Value>
</Setter>
</Style>
Les deux fixations du RenderTransform
poseur de RectangleStyle
sont la cause de l'erreur, mais je ne sais pas quoi faire pour résoudre le problème. Fait intéressant, les graphismes sont traduit correctement, de sorte que WPF est en mesure de résoudre les liaisons, c'est juste pas heureux à ce sujet pour une raison.
Ce que je peux faire pour corriger les liaisons?
Modifier
J'ai envoyé un rapport de bug sur MS Connect:
- Eh bien, c'est facile à reproduire. J'ai essayé à propos de 10 choses différentes, mais avec les fixations de travail OK, je me demandais si vous aussi vous devez vous connecter celui-ci sur MME le Connecter et de les laisser me demande si c'est un bug.
- Ressemble le rapport de bug, le lien est changé ou n'est plus public. Vous demandez-vous à propos de la résolution de ce depuis l'ajout de x:le Nom ne fait rien pour moi.
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas expliquer pourquoi le message d'erreur se produit, mais j'ai trouvé que l'ajout d'un x:Nom de la propriété à la transformation est un moyen de se débarrasser de ce message d'erreur:
Je pense que j'ai trouvé quelques infos utiles.
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683
La réponse à ce qui semble être dans le Microsoft explication du comportement comme un ItemsControl passe le processus de composition et applique les liaisons et les styles. C'est, WPF est en essayant d'optimiser votre DataTemplate avant qu'il ait une source de données pour évaluer les liaisons: "dataitem=null". Dans tous les autres cas au cours de sa mise en page passe, "dataitem" points à quelque chose dans votre "Zones" IEnumerable et il est capable de remplir les liaisons. Sinon, vous pouvez voir l'erreur avec chaque élément dans votre collection, plutôt qu'une fois par propriété.
Il semble être un "ne faites pas attention à l'homme derrière le rideau" genre de chose. Et il devrait probablement être ajouté à MME le Connecter comme un rapport de bogue; les code ne doit pas le coup de "Erreur"s qui n'a pas d'importance. Mais je vais le laisser à vous de le remplir avec MS Connecter si vous le souhaitez.
Après la lecture de Rob Perkins réponse, j'ai ajouté un FallbackValue à une liaison avec ce problème. Cette effacé l'erreur pour moi.