2009-08-19 7 views
12

Je travaillais avec le contrôle ComboBox et je ne pouvais pas obtenir le SelectedItem à partir de la propriété de mon viewmodel. Voici la définition de contrôle:Définition de l'attribut Silverlight XAML Order Matters

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    DisplayMemberPath="FullName"/> 

J'avais un autre contrôle Combobox qui fonctionnait bien. La différence entre un qui définirait le SelectedItem et celui qui ne serait pas l'ordre de la définition de l'attribut. Voici la définition de contrôle de travail:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    DisplayMemberPath="FullName"/> 

La différence entre les deux est que le ItemsSource est défini avant la SelectedItem sur le travail celui qui me porte à croire que dans ce cas au moins, la définition de l'attribut questions d'ordre. Ai-je manqué quelque chose ou ai-je trouvé que c'était vrai? A-t-il été documenté nulle part?

Répondre

15

Oui, l'ordre peut être important. Considérons que la lecture XAML implique la création d'objets et l'affectation de valeurs aux propriétés de ces objets. Il n'est pas possible d'assigner des valeurs de propriété en même temps, il est clair qu'une propriété va être affectée suivie par une autre et ensuite une autre jusqu'à ce que toutes les propriétés soient assignées.

Étant donné que l'affectation de propriétés dans certains objets entraîne des effets de bord et d'autres codes, l'ordre d'affectation de ces propriétés peut avoir une incidence sur le résultat. Ceci est bien sûr une mauvaise chose.

+0

Dans ce cas, il est logique qu'un élément d'une liste ne puisse pas être sélectionné si la liste n'existe pas en premier lieu. C'est une anomalie à prendre en compte lors du codage de Silverlight XAML. Peut-être que des outils comme Expression Blend s'assurent que les attributs sont définis dans le bon ordre? – DaveB

+0

@DaveB: Je ne suis pas sûr que ce soit le cas, je devrais tester ce scénario moi-même. Dans mon utilisation habituelle jusqu'à présent, le contexte de données est attribué à un ancêtre plus tard que l'une ou l'autre des deux propriétés, auquel cas l'ordre dans lequel ces propriétés sont attribuées ne devrait pas avoir d'importance. – AnthonyWJones

+0

Les instructions indiquent que cela ne devrait pas avoir d'importance: "Autoriser les propriétés à être définies dans n'importe quel ordre, même si cela entraîne un état invalide temporaire de l'objet." https://msdn.microsoft.com/en-us/library/ms229006%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396 – Wouter

2

La prochaine fois que vous rencontrerez un problème similaire à celui-ci, vous craignez que la liaison échoue en raison de la commande. Vérifiez votre fenêtre de sortie, il affiche toutes les erreurs de liaison, Donc, à partir de cette erreur, vous auriez pu déduire que la ItemSource était nulle au moment de lier la propriété SelectedItem

+0

Ceci est un excellent point. Je n'ai même pas pensé à regarder là-bas. – DaveB

5

En toute circonstance dans laquelle l'ordre que les propriétés sont définies est important, vous devez utiliser la syntaxe de l'élément, ne pas attribuer la syntaxe, pour représenter ces propriétés dans votre XAML:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" DisplayMemberPath="FullName"> 
    <ComboBox.ItemsSource> 
     <Binding Path="Employees" Mode="OneWay"/> 
    <ComboBox.ItemsSource> 
    <ComboBox.SelectedItem> 
     <Binding Path="EditingJob.Employee" Mode="TwoWay" 
     ValidatesOnExceptions="true" NotifyOnValidationError="true"/> 
    </ComboBox.SelectedItem> 
</ComboBox> 

Selon la recommandation XML, l'ordre des attributs sur un élément est non significatif. Les outils XML ne sont pas tenus de conserver l'ordre dans lequel ils apparaissent. Ainsi, si vous avez par exemple traité cet élément ComboBox avec une transformation XSLT (ce qui n'est pas une idée folle dans certains cas), la transformation peut modifier l'ordre de vos attributs. si c'est le cas <xsl:copy-of>. Le processeur XSLT probablement ne le fera pas, mais il n'est pas nécessaire pas à.

Quel effet rendrait aléatoire l'ordre des attributs de chaque élément de votre XAML sur le comportement de votre application? La réponse à cette question devrait être "rien".

Ceci est un aspect de XAML qui me rend très nerveux.

Questions connexes