2010-03-26 16 views
42

W moim konkretnym przypadku, chcę powiązać właściwość IsReadOnly z TextBox, aby ustawić właściwość Zawartość przycisku? Oba są częścią tego samego StackPanel.Jak powiązać właściwość innej kontrolki z wyzwalacza?

Próbowałem to zrobić za pomocą DataTrigger z powiązaniem z ElementName w TextBox i wyzwalaczem, używając nazwy TextBox jako SourceName.

Jakieś myśli?

Odpowiedz

63

Musisz określić wyzwalacz jako część stylu - kolekcja Triggers na samym przycisku może zawierać tylko wyzwalacze zdarzeń. Mając to na uwadze, DataTrigger działa dobrze. Istnieje jednak zmarszczka: wartość z ustawiacza wyzwalaczy nie zastąpi lokalnej właściwości treści. Więc musisz ustawić domyślną treść również w stylu. Oto jak to wygląda:

<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! Wiedziałem, że istnieje precedens własności, ale nie przyszło mi do głowy, że bezpośrednie nadpisałoby działanie wyzwalacza. Używam DP jako źródła wiążącego i zakończyłem z takim samym brakiem zachowania, jak próba użycia ElementName, więc problem był związany z prekondencją właściwości. Dzięki za wyczyszczenie tego! – rrhartjr

+0

to jest bardzo miłe. właśnie to, czego potrzebowałem, prawie zamierzałem zakodować konwerter. ale jest ładniej. – user1841243

+0

> Istnieje jednak zmarszczka: wartość z ustawiacza wyzwalaczy nie zastąpi lokalnej właściwości Treści. To jest ważne! Tęskniłem za pierwszym razem, gdy czytałem tę odpowiedź. – SteveP

5

Czy próbowałeś to:

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

??

+0

Może chcieć, aby jego przycisk mówił coś bardziej znaczącego niż Prawda czy Fałsz, chociaż \ * grin \ *. Co możesz zrobić, wkładając konwerter, oczywiście, ale wyzwalacz czuje się bardziej idiomatycznie ... – itowlson

+0

Mark, zredagowałem twój kod, żeby pozbyć się jakichś obcych bitów, które sprawiały, że trudno było zobaczyć rdzeń twojej sugestii. Mam nadzieję, że to jest w porządku - jeśli uważasz, że zniekształciłem twoje intencje, wycofaj się. – itowlson

+0

to w porządku, dzięki za to, po prostu przyspieszyłem to naprawdę szybko i prawdopodobnie powinienem to wyczyścić :) – Mark

Powiązane problemy