2010-03-26 20 views

Respuesta

63

Debe especificar el desencadenador como parte de un estilo: la colección Disparadores del botón solo puede contener activadores de eventos. Con eso en mente, un DataTrigger funciona bien. Sin embargo, hay una arruga: el valor del Trigger Setter no sobrescribirá una propiedad de contenido local. Por lo tanto, también debe establecer el contenido predeterminado en el estilo. Así es como se ve:

<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, ja! Sabía que había una prioridad de la propiedad, pero no se me ocurrió que el directo sobrescribiría la acción del disparador. Estoy usando un DP como fuente de enlace y terminé con la misma falta de comportamiento que al tratar de usar ElementName, por lo que el problema fue realmente con el precinto de la propiedad. ¡Gracias por aclarar eso! – rrhartjr

+0

esto es muy bueno. justo lo que necesitaba, casi iba a codificar un convertidor. pero esto es más agradable. – user1841243

+0

> Sin embargo, hay una arruga: el valor del Trigger Setter no sobrescribe una propiedad de contenido local. ¡Esto es importante! Lo extrañé la primera vez que leí esta respuesta. – SteveP

5

Has probado esto:

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

??

+0

Es posible que desee que su botón diga algo más significativo que Verdadero o Falso aunque \ * grin \ *. Lo cual puedes hacer insertando un convertidor, por supuesto, pero un disparador se siente más idiomático ... – itowlson

+0

Mark, edité tu código para deshacerte de algunos bits extraños que sentí dificultó ver el núcleo de tu sugerencia. Espero que esto esté bien, si sientes que he distorsionado tu intento, por favor retrocede. – itowlson

+0

eso está bien, gracias por eso, lo mejoré rápidamente y probablemente debería haberlo limpiado :) – Mark

Cuestiones relacionadas