2011-09-27 8 views
12

Ho un elenco di oggetti contenuti in un oggetto IEnumerable <>. Vorrei impostare la visibilità di un controllo in base al conteggio di questo elenco. Ho provato:Visibilità vincolante di un controllo a "Conteggio" di un oggetto IEnumerable

Visibility="{Binding MyList.Count>0?Collapsed:Visible, Mode=OneWay}" 

Ma questo non funziona. Ho provato a legare MyList.Count al testo in un blocco di testo per garantire che il valore di conteggio fosse corretto, e lo è. Semplicemente non sembra impostare correttamente la visibilità.

+0

Sembra che si potrebbe usare questo: http://www.11011.net/wpf-binding-expressions – Gabe

risposta

28

Non è possibile utilizzare le espressioni logiche o di codice nei binding (si aspetta un PropertyPath). Utilizzare un converter o trigger, che è quello che vorrei fare: (. È possibile, naturalmente, refactoring dello stile in un resource se lo si desidera)

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

+0

grazie, questo è fantastico - sapresti come si può refactoring in un elemento di risorsa in modo che tu possa passare in differenza Elenca come parametri? – BKSpurgeon

+0

@BKSpurgeon: Beh, questo è difficile da fare se la proprietà sul contesto dati non è la stessa, purtroppo i collegamenti sono piuttosto statici. Se si dispone dell'opzione, è possibile creare alcune convenzioni in modo che il percorso funzioni con vari contesti di dati, un'interfaccia per così dire che il contesto dei dati implementa, fornendo una proprietà di lista che ha sempre lo stesso nome. –

+0

@BKSpurgeon: Esiste la possibilità di costruire percorsi di binding più o meno dinamicamente usando le estensioni di markup, ma probabilmente si eseguono in fase di creazione dello stile piuttosto che in un'applicazione, quindi probabilmente non portano da nessuna parte. –

0

È necessario utilizzare un convertitore, che converta la proprietà Count in un valore Visibility, o forse una nuova proprietà booleana "HasItems" in un valore Visibility. Usiamo qualcosa, ad esempio, chiamato boolToVisibilityConvert, per gestire lavori come questo.

Posso darti dettagli più precisi, se ne hai bisogno.

2
Ci

è tre modi:

  1. per utilizzare i trigger menzionati da HB
  2. da usare convertitori mediante l'attuazione di IValueConverter in una classe e impostando la proprietà convertitore di Binding a un'istanza di IValueConverter in quella classe
  3. per definire una proprietà nel vostro ViewModel per tornare direttamente lo stato di visibilità.

È sempre possibile utilizzare il metodo Trigger ed è sempre un buon approccio. Il terzo metodo è utile (ed è il migliore) quando si utilizza il pattern MVVM (e non si limita a fare riferimento agli assembly relativi all'interfaccia utente nel ViewModel) Suggerisco di utilizzare i trigger, ma se non si desidera rendere il vostro xaml sporco da quello molti codici di markup usano convertitori.

Problemi correlati