2013-10-11 12 views
9

Ho un TextBox con uno stile che ha un DataTrigger che cambia il testo, in questo modo:WPF Style DataTrigger con il legame di DataContext non funziona

<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> 

Ma non funziona, il testo non cambia mai per "Bar ". Ho testato utilizzando un altro TextBlock con Text = "{Binding MyBool}" e questo testo cambia da "False" a "True". Snoop non rivela errori che posso vedere e non c'è nulla nell'output.

Questa domanda può sembrare un duplicato di WPF Trigger binding to MVVM property, ma il mio codice non sembra diverso dalla risposta accettata (http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx, sezione "Uso di uno stile") in qualsiasi modo pertinente. E l'utilizzo di un DataTemplate come suggerito nella risposta effettiva sembra errato dal momento che voglio solo applicare a un singolo TextBlock, ma se è corretto, non sono sicuro di come scrivere un DataTemplate per questo ...

EDIT :

Questo è ciò che la proprietà che sto legame al assomiglia:

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

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

La prima cosa che devi fare è alzare i messaggi di debug per l'associazione dati: http://i.stack.imgur.com/MF8i5.png Avanti, re-run e controllare la finestra di output e vedere quali errori ci sono. Potresti averlo fatto; il fatto che tu abbia parlato di ficcanaso indica che sei molto più avanti del pacco. Probabilmente hanno bisogno anche delle parti rilevanti della VM nella domanda. – Will

+0

Controllerei la finestra di output per eventuali errori. Potrebbe essere qualcosa di semplice come il legame che viene incasinato. – gleng

+0

Sì, come ho detto: "non c'è nulla nell'output". Gli avvisi per gli errori di associazione sono abilitati. Aggiornerò il post principale con la proprietà ... ma come ho già detto, posso legare e visualizzare il valore della stessa proprietà, ma non funziona nel trigger. – moggizx

risposta

44

non è possibile utilizzare un Trigger per aggiornare una proprietà che è impostata in modo esplicito nel vostro XAML. Prova a modificare:

<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

Ora QUELLO è semplicemente sciocco ... c'è davvero una buona ragione per questo? – moggizx

+4

Non sarei d'accordo con te lì ... si tratta di [Dependency Property Value Precedence] (http://msdn.microsoft.com/en-us/library/ms743230.aspx) in quanto vi sono molti modi per impostare un ' DependencyProperty'. Ha solo più senso se ne sei consapevole. – Sheridan

+0

Grazie mille amico! –