2010-08-05 5 views
3

Aujourd'hui, j'ai été confronté à un problème qui me rappelait que les fixations se détachaient automatiquement dans certains cas. Je ne suis pas sûr, mais voici le scénario -Cas où la reliure est détachée automatiquement

Je joins un élément de menu lié à une propriété (mise en œuvre INotifyPropertyChanged), comme celui-ci -

IsChecked="{Binding Path=DisplayLongUnit, Mode=TwoWay}" 

maintenant dans son gestionnaire d'événements cochés mettre à jour sa valeur IsChecked après vérification de certaines conditions comme celle-ci -

If(condition == true){menuItem.IsChecked = true} 

La liaison sera-t-elle toujours attachée ou sera-t-elle perdue? (Je me souviens avoir lu quelque part qu'il serait perdu).

Existe-t-il des scénarios dans lesquels les liaisons seront détachées automatiquement?

Un que je pourrais savoir est mentionné ici -

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/08d6e4c4-47ab-44f3-b19a-c0ab872fb1a8

Répondre

0

Avez-vous essayé une reliure à deux voies?

IsChecked="{Binding Path=DisplayLongUnit, Mode=TwoWay}" 
0

Un exemple plus précis de ce que votre problème est ici:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/4165daed-2eaf-450b-a082-63d79ff9fd3e

Vous pouvez faire le mode de liaison à double sens (cette façon, votre propriété sera mise à jour aussi, et je n » Je ne sais pas quelle est la valeur par défaut pour IsChecked, mais il est toujours préférable d'être explicite) ou simplement de modifier la propriété DisplayLongUnit à la place de la propriété IsChecked. N'oubliez pas de définir "IsCheckable" sur true. N'oubliez pas d'indiquer "IsCheckable" comme suit:

+0

Merci pour votre réponse Carrotman mais je ne suis pas confronté à un problème avec l'exemple de liaison que j'ai fourni dans ma question. La question est sur la liaison se réinitialiser ou perdu dans certains scénarios. – akjoshi

0

Si c'est faux, la liaison TwoWay ne fonctionnera pas. Les données lié à la suite MenuItem fonctionne pour moi (pas de code-behind):

<MenuItem Header="Select sense" ItemsSource="{Binding Path=AvailableSenses}" > 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding Path=Sense.English}" /> 
      <Setter Property="IsCheckable" Value="True" /> 
      <Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 
5

A propos de savoir si une liaison a été détaché: ce que vous pouvez faire est déboguer votre liaison. Vous devez d'abord ajouter l'espace de noms de diagnostic dans votre code XAML. Voici un exemple sur une fenêtre (j'ai supprimé les autres espaces de noms habituels pour plus de clarté):

<Window xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"> 

puis d'activer la trace sur une liaison. Voici un exemple avec un ensemble de liaison sur une propriété de texte de TextBox:

<TextBox Text={Binding FirstName, diagnostics:PresentationTraceSources.TraceLevel=High} /> 

Maintenant, si vous regardez dans l'onglet Sortie de Visual Studio lors de l'exécution de votre programme, vous verrez des informations sur votre reliure, y compris "détachez "quand il a été détaché. Donc, cela ne vous dit pas POURQUOI il a été détaché, seulement quand. Cela peut aider cependant.