2010-07-05 4 views
19

J'ai un ItemsControl qui affiche un groupe de rectangles. Chaque rectangle doit être décalé vers le haut et vers la gauche. J'ai donc créé un RectangleStyle qui utilise des liaisons pour définir la largeur, la hauteur, la translation X et la translation Y pour un rectangle.La liaison dans le style WPF provoque une erreur inexplicable "Impossible de trouver l'élément FrameworkElement"

La largeur et la hauteur des liaisons fonctionnent très bien, mais je me fais l'erreur suivante pour les liaisons TranslateTransform:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Offset.X; DataItem=null; target element is 'TranslateTransform' (HashCode=16452547); target property is 'X' (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 dans le poseur RenderTransform de RectangleStyle sont la cause de l'erreur, mais je ne suis pas sûr de ce qu'il faut faire pour résoudre le problème. Fait intéressant, les graphiques sont étant traduit correctement, donc WPF est capable de résoudre les liaisons - ce n'est pas content pour eux pour une raison quelconque.

Que puis-je faire pour réparer les liaisons?


Modifier

J'ai présenté un rapport de bogue sur MS Connect:

https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window

+0

Eh bien, il est facile à dupliquer. J'ai essayé environ 10 choses différentes, mais avec les liaisons fonctionnent bien, je me demande si vous devez vous connecter sur MS Connect et laissez-les se demander si c'est un bug. –

+0

On dirait que le lien du rapport de bogue est modifié ou n'est plus public. Vous vous demandez la résolution de cela depuis l'ajout de x: Name ne fait rien pour moi. –

Répondre

41

Je ne peux pas expliquer aussi pourquoi le message d'erreur se produit, mais j'ai découvert que l'ajout d'un x: la propriété Nom de la transformation est un moyen de se débarrasser du message d'erreur:

<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" /> 
+0

J'ai le même problème quand j'utilise GradientStops dans mon déclencheur de modèle de contrôle. Donner un x: Nom ne fonctionne pas pour moi. Ce bug est vraiment frustrant car j'ai environ 20 GradientStops pour un contrôle et dans ma vue j'utilise ce contrôle 30 fois. Maintenant, vous pouvez imaginer combien de temps il faut pour ouvrir la vue pendant le débogage ... – Bulli

+4

J'ai eu le même problème. Qu'est-ce que dans l'enfer a x: Nom à faire avec la liaison ??? – Enyra

+1

Belle solution de contournement; ces erreurs fallacieuses m'ennuyaient vraiment. Étant donné le nombre d'années depuis la publication du message original, je suppose que cela a été décidé de ne pas valoir la peine d'être réparé. –

9

Je pense avoir trouvé quelques informations utiles.

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683

La réponse à cela semble être dans l'explication du comportement Microsoft comme ItemsControl passe par son processus de compositing et applique les liaisons et les styles. C'est-à-dire, WPF essaye d'optimiser votre DataTemplate avant qu'il ait une source de données pour évaluer avec succès les liaisons: "dataitem = null". Dans tous les autres cas, lors de sa mise en page, "dataitem" pointe vers quelque chose dans vos "Zones" IEnumerable et il est capable de compléter les liaisons. Sinon, vous verriez l'erreur avec chaque élément de votre collection, plutôt qu'une seule fois par propriété.

Il semble que ce soit un type de chose «ne faites pas attention à l'homme derrière le rideau». Et il devrait probablement être ajouté à MS Connect en tant que rapport de bogue; Le code réussi ne doit pas expulser les "erreurs" qui n'ont pas d'importance. Mais je vous laisse le soin de le faire avec MS Connect si vous le souhaitez.

+1

+1, je suis d'accord, et je viens de soumettre un bug sur MS Connect: https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears -in-output-window – devuxer

+3

Wow. Il leur a fallu quelque chose comme cinq minutes pour décider "gee whiz wow, vous avez raison, mais nous ne réparerons pas ça." –

+1

Je me demande si WPF est déjà derrière WinRT. – devuxer

1

Après avoir lu Rob La réponse de Perkins, j'ai ajouté un FallbackValue à une liaison avec ce problème. Cela a effacé l'erreur pour moi.

Questions connexes