2010-03-26 3 views
42

В моем конкретном случае я хочу привязать свойство IsReadOnly к TextBox, чтобы установить свойство Content Button? Они являются частью одной и той же StackPanel.Как связать свойство другого элемента управления с триггером?

Я попытался сделать это с помощью DataTrigger с привязкой к элементу NameTextBox и триггера, используя имя TextBox в качестве SourceName.

Любые мысли?

ответ

63

Вам нужно указать триггер как часть стиля - коллекция триггеров на самой кнопке может содержать только триггеры событий. Имея это в виду, DataTrigger отлично работает. Тем не менее, есть морщина: значение из Set Trigger Setter не будет перезаписывать локальное свойство Content. Таким образом, вы также должны установить контент по умолчанию в стиле. Вот как это выглядит:

<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! Я знал, что есть приоритет собственности, но мне не приходило в голову, что прямая перезаписывает действие триггера. Я использую DP как источник привязки и в итоге оказался с таким же отсутствием поведения, как попытка использовать ElementName, поэтому проблема была на самом деле с вероятностью свойства. Спасибо, что поняли! – rrhartjr

+0

это очень приятно. просто то, что мне было нужно, я почти собирался закодировать конвертер. но это лучше. – user1841243

+0

> Однако есть морщина: значение из Set Trigger Setter не будет перезаписывать локальное свойство Content. Это важно! Я пропустил это в первый раз, когда прочитал этот ответ. – SteveP

5

Вы пробовали это:

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

??

+0

Возможно, он хочет, чтобы его кнопка говорила что-то более значимое, чем True или False, хотя \ * grin \ *. Что вы можете сделать, вставив конвертер, конечно, но триггер чувствует себя более идиоматичным ... – itowlson

+0

Марк, я отредактировал ваш код, чтобы избавиться от некоторых посторонних битов, которые, как мне показалось, затрудняли увидеть суть вашего предложения. Надеюсь, что все в порядке - если вы чувствуете, что я исказил ваши намерения, тогда, пожалуйста, откатитесь. – itowlson

+0

это нормально, спасибо за это, я просто взбивал его очень быстро и, вероятно, должен был его очистить :) – Mark

Смежные вопросы