views:

341

answers:

2

In my particular case, I want to bind to the IsReadOnly property of a TextBox to set the Content property of a Button? They are both part of the same StackPanel.

I've tried doing it with a DataTrigger with a Binding to the ElementName of the TextBox and a Trigger using the TextBox name as the SourceName.

Any thoughts?

A: 

Have you tried this:

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

??

Mark
He may want his button to say something more meaningful than True or False though \*grin\*. Which you can do by inserting a converter, of course, but a trigger does feel more idiomatic...
itowlson
Mark, I edited your code to get rid of some extraneous bits that I felt made it hard to see the core of your suggestion. Hope this is okay -- if you feel I've distorted your intent then please roll back.
itowlson
that's fine, thanks for that, I just whipped it up real quick and probably should have cleaned it up :)
Mark
+2  A: 

You need to specify the trigger as part of a style -- the Triggers collection on the Button itself can only contain event triggers. With that in mind, a DataTrigger works fine. However, there is a wrinkle: the value from the Trigger Setter won't overwrite a local Content property. So you have to set the default Content in the Style as well. Here's how it looks:

<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>
itowlson
Ah ha! I knew there was a property precedence, but it didn't occur to me that direct would overwrite the Trigger action.I'm using a DP as the binding source and ended up with the same lack of behavior as trying to use ElementName, so the problem was actually with the property precdence.Thanks for clearing that up!
rrhartjr