web-dev-qa-db-fra.com

Comment puis-je me lier à la propriété d'un autre contrôle à partir d'un déclencheur?

Dans mon cas particulier, je veux me lier à la propriété IsReadOnly d'un TextBox pour définir la propriété Content d'un Button? Ils font tous deux partie du même StackPanel.

J'ai essayé de le faire avec un DataTrigger avec une liaison au ElementName du TextBox et un Trigger en utilisant le nom du TextBox comme SourceName.

Des pensées?

50
rrhartjr

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énements. Dans cet esprit, un DataTrigger fonctionne très bien. Cependant, il y a une ride: la valeur du Trigger Setter ne remplacera pas une propriété de contenu locale. Vous devez donc également définir le contenu par défaut dans le style. Voici à quoi ça 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>
76
itowlson

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>

??

8
Mark