2011-08-19 12 views
10

Questo comportamento mi sembra incredibilmente strano e presumo di fare qualcosa di sbagliato per ottenerlo. Ho un ContentControl che utilizza un DataTemplet 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:WPF Trigger non imposta la proprietà se impostato nell'elemento

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png"> 
      <Image.Style> 
       <Style TargetType="Image"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
         Value="0"> 
          <Setter Property="Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 

Questo non funziona ... una specie di.

L'ho provato 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 definite in modo esplicito? Non è questo il suo scopo?

+0

Hai provato a impostarlo dall'altra parte? Come in, quando Value! = "0" imposta la visibilità su non visibile? – mydogisbox

+0

Puoi persino usare! = In un valore di trigger? – Tyrsius

+0

Non direttamente, ma con un po 'di sforzo si può fare. @CodeNaked ha una soluzione migliore. Ecco la soluzione indesiderabile. http://blogs.msdn.com/b/mikehillberg/archive/2008/09/30/comparabledatatrigger.aspx – mydogisbox

risposta

18

Questo è il normale Dependency Property Value Precedence. Impostandolo su Image è al # 3, mentre nel trigger Style si ha una precedenza inferiore del # 6.

È possibile fare questo, invece:

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Hidden" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
        Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 
+0

+1 Mi sono sempre chiesto perché a volte avevo bisogno di impostare il setter nello stile e il trigger per il grilletto per funzionare – Rachel

+0

Questo non si applica al valore predefinito o un valore ereditato dai metadati. Vedere la mia risposta per il motivo per cui è necessario impostare il valore nel setter oltre a impostarlo con il trigger. – mydogisbox

+0

@mydogisbox - Non sono sicuro di cosa intendi. Se il Trigger imposta Visibilità su Nascosto e non c'è nessun setter aggiuntivo all'esterno del trigger, quando il trigger non si applica più lo ripristinerebbe sul valore predefinito (che è Visibile). – CodeNaked

6

Imposta la visibilità in stile in aggiunta al Trigger

che ho incontrato questo comportamento strano con DataTriggers molte volte, dove a volte DataTrigger Setter vinti avere effetto a meno che l'incastonatore non sia definito anche nello stile.

non Lavoreranno

<Image Visibility="Collapsed"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

Lavoreranno

<Image> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

Edit: Vedere the accepted answer 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 nello <Tag> hanno sempre la precedenza sui valori attivati.

0

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.

+0

Il valore originale nel suo esempio non è visibile, è nascosto. – CodeNaked

+0

Sì, ma è necessario leggere il resto dei suoi commenti sul problema. Lo ha testato con la proprietà impostata sull'immagine stessa (non può cambiare con il trigger dei dati), ha testato su altri controlli con il valore predefinito di non visibile (funziona) e ha testato con il trigger nascosto anziché mostrare (funziona). Poiché il valore predefinito è visibile, l'unico modo in cui un trigger di dati funzionerà è l'ultimo, altrimenti verrà impostato come predefinito e il trigger non farà nulla. – mydogisbox

Problemi correlati