2013-10-11 19 views
9

Mam TextBox ze stylem, który ma DataTrigger który zmienia tekst w następujący sposób:WPF Style DataTrigger z wiązania się DataContext nie działa

<Grid> 
    <TextBlock Text="Foo"> 
     <TextBlock.Style> 
      <Style BasedOn="{StaticResource TextStyle}" TargetType="TextBlock"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding MyBool}" Value="True"> 
         <Setter Property="Text" Value="Bar"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</Grid> 

Ale to nie działa, nigdy tekst zmienia się na „bar ". Przetestowałem używając innego TextBlocka z Text = "{Binding MyBool}" i tekst ten zmienia się z "False" na "True". Snoop nie ujawnia żadnych błędów, które widzę i nie ma nic w wynikach.

To pytanie może wydawać się duplikatem WPF Trigger binding to MVVM property, ale mój kod nie różni się od zaakceptowanej odpowiedzi (http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx, sekcja "Używanie stylu") w każdy odpowiedni sposób. Używanie DataTemplate zgodnie z sugestią w rzeczywistej odpowiedzi wydaje się błędne, ponieważ chcę tylko, aby to zastosowanie do pojedynczego TextBlock, ale jeśli jest prawidłowe, nie jestem pewien, jak napisać DataTemplate do tego ...

EDYCJA :

to właśnie właściwość jestem wiązania się wygląda następująco:

public bool MyBool 
{ 
    get { return _myBool; } 
    set 
    { 
     if (_myBool== value) 
      return; 

     _myBool= value; 
     NotifyPropertyChanged(); 
    } 
} 
private bool _myBool; 
+3

Pierwszą rzeczą, którą trzeba zrobić, to włączyć się komunikaty debugowania dla wiązania z danymi: http://i.stack.imgur.com/MF8i5.png Następnie ponownie uruchomić i sprawdzić okno wyjściowe i zobacz, jakie są błędy. Mogłeś to zrobić; fakt, że wspomniałeś snoop wskazuje, że jesteś daleko przed plecakiem. Prawdopodobnie potrzebna jest odpowiednia część VM w pytaniu. – Will

+0

Sprawdziłbym okno wyjściowe pod kątem błędów. Może to być coś tak prostego, jak wiązanie jest zawalone. – gleng

+0

Tak, jak już wspomniałem: "nic nie ma na wyjściu". Ostrzeżenia dotyczące błędów wiązania są włączone. Zaktualizuję główny post z właściwością ... ale jak już wspomniałem, mogę powiązać i wyświetlić wartość tej samej właściwości, dobrze, po prostu nie działa w wyzwalaczu. – moggizx

Odpowiedz

44

nie można użyć Trigger zaktualizować właściwość, która jest jawnie ustawiony w XAML. Spróbuj to zamiast:

<Grid> 
    <TextBlock> 
     <TextBlock.Style> 
      <Style BasedOn="{StaticResource TextStyle}" TargetType="TextBlock"> 
       <Setter Property="Text" Value="Foo" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding MyBool}" Value="True"> 
         <Setter Property="Text" Value="Bar" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</Grid> 
+5

Teraz TO jest po prostu głupie ... czy rzeczywiście ma ku temu dobry powód? – moggizx

+4

Nie zgodziłbym się z tobą tam ... chodzi tylko o [Priorytet wartości właściwości zależności Dependency] (http://msdn.microsoft.com/en-us/library/ms743230.aspx), ponieważ istnieje wiele sposobów na ustawienie " DependencyProperty'. To ma więcej sensu, jeśli jesteś tego świadomy. – Sheridan

+0

Wielkie dzięki człowieku! –