WPF Trigger non imposta la proprietà se impostato in Element

Questo comportamento mi sembra incredibilmente strano e presumo di fare qualcosa di sbagliato per ottenerlo. Ho un ContentControl che utilizza un DataTemplete per eseguire il rendering di un controllo TabControl. Voglio un’immagine da visualizzare quando non ci sono tabulazioni aperte e ci si nasconde quando ci sono. Ma ecco il problema:

            

Questo non funziona … tipo.

Ho provato questo su Visiblity e Margin (solo per essere sicuro). Questo trigger modificherà la proprietà, a meno che tale proprietà non sia definita nei tag Image . Se lo è, il trigger non aggiornerà quella proprietà. Quindi, se non definisco una visibilità per l’immagine e il trigger lo nasconde, funziona. Il problema è che l’impostazione predefinita è Visibile e che il trigger deve mostrarlo quando value = 0 e nasconderlo altrimenti.

Perché il trigger non sovrascrive le proprietà che sono esplicitamente definite? Non è questo il suo scopo?

Questa è la normale precedenza del valore della proprietà di dipendenza . Impostandolo su Image è al # 3, mentre nel trigger Style si ha una precedenza inferiore del # 6.

Puoi farlo invece:

      

Imposta la visibilità nello stile in aggiunta a Trigger

Ho riscontrato questo strano comportamento con DataTriggers molte volte, dove a volte DataTrigger Setters non ha effetto a meno che il Setter sia definito anche nello Stile.

Non funzionerà

      

Funzionerà

      

Modifica: guarda la risposta accettata per una spiegazione sul perché questo non funziona. Ha a che fare con l’ordine in cui vengono determinate le proprietà di dipendenza, dove le proprietà definite nel sempre la precedenza sui valori triggersti.

Quando un trigger è true, modifica il valore sul valore desiderato. Quando non è più true, restituisce il valore al valore precedente. Non lo cambierà in un valore che non vuole.

Ciò significa che se il valore originale è visibile e lo si cambia in visibile, quando il trigger non è più attivo, il valore tornerà a essere visibile.