2010-03-26 2 views
42

Dans mon cas particulier, je veux lier à la propriété IsReadOnly d'un TextBox pour définir la propriété Content d'un bouton? Ils font tous deux partie du même StackPanel.Comment lier à la propriété d'un autre contrôle à partir d'un déclencheur?

J'ai essayé de le faire avec un DataTrigger avec une liaison au ElementName de la zone de texte et un déclencheur en utilisant le nom de la zone de texte comme le nom de source.

Des pensées?

Répondre

63

Vous devez spécifier le déclencheur dans le cadre d'un style - la collection Triggers sur le bouton lui-même ne peut contenir que des déclencheurs d'événement. Dans cet esprit, un DataTrigger fonctionne bien. Cependant, il y a une ride: la valeur du Trigger Setter ne remplacera pas une propriété Content locale. Vous devez donc également définir le contenu par défaut dans le style. Voici à quoi cela ressemble:

<Button> <!-- Note no content set directly on button --> 
    <Button.Style> 
    <Style TargetType="Button"> 
     <Setter Property="Content" Value="You may write!!!" /> <!-- Here is the 'normal' content --> 
     <Style.Triggers> 
     <!-- Here is how we bind to another control's property --> 
     <DataTrigger Binding="{Binding IsReadOnly, ElementName=textBox}" Value="True"> 
      <Setter Property="Content" Value="NO NO NO" /> <!-- Here is the 'override' content --> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Button.Style> 
</Button> 
+1

Ah ha! Je savais qu'il y avait une préséance de propriété, mais il ne me venait pas à l'esprit que le direct écraserait l'action Trigger. J'utilise un DP comme source de liaison et je finis avec le même manque de comportement que d'essayer d'utiliser ElementName, donc le problème était en fait avec la précision de la propriété. Merci d'avoir éclairci ça! – rrhartjr

+0

c'est très bien. juste ce dont j'avais besoin, j'allais presque coder un convertisseur. mais c'est plus agréable. – user1841243

+0

> Cependant, il y a une ride: la valeur du Trigger Setter n'écrase pas une propriété Content locale. Ceci est important! J'ai raté la première fois que j'ai lu cette réponse. – SteveP

5

Avez-vous essayé ceci:

<StackPanel x:Name="LayoutRoot"> 
    <Button Width="75" Content="{Binding IsReadOnly, ElementName=textBox, Mode=Default}" /> 
    <TextBox x:Name="textBox" VerticalAlignment="Top" Text="TextBox" /> 
</StackPanel> 

??

+0

Il peut vouloir que son bouton dise quelque chose de plus significatif que Vrai ou Faux cependant \ * grin \ *. Ce que vous pouvez faire en insérant un convertisseur, bien sûr, mais un déclencheur se sent plus idiomatique ... – itowlson

+0

Mark, j'ai édité votre code pour se débarrasser de quelques bits étrangers que j'ai ressenti qu'il était difficile de voir le noyau de votre suggestion. J'espère que ça va - si vous avez l'impression d'avoir déformé votre intention, veuillez revenir en arrière. – itowlson

+0

c'est bien, merci pour cela, je l'ai juste fouetté très rapidement et probablement aurait dû le nettoyer :) – Mark

Questions connexes