2011-11-23 16 views
6

Non copierò/incollerò il mio intero file xaml. Sarà troppo lungo da spiegare, ma qui è ciò che è interessante: ho avuto un legame di un "Nome" ProprietàAssociazione a una seconda proprietà se la prima è "indefinita"

<TextBlock Text="{Binding Name}"/> 

Il fatto è che a volte, la mia voce non ha un "nome" di proprietà. Non si blocca ma ho semplicemente ottenuto un testo vuoto nel mio TextBlock

Cosa farei, se Nome è vuoto, deve essere associato a "niente", solo {Binding}. Questo mostrerà il mio nome oggetto e sarà perfetto!

Grazie in anticipo per qualsiasi aiuto, e scusate se è una domanda noobie :(

risposta

6

Quello che vuoi: ecco un PriorityBinding.

In particolare, sarebbe simile (sintassi esatta potrebbe essere necessaria una verifica):

  <TextBlock> 
      <TextBlock.Text> 
       <PriorityBinding> 
        <Binding Path="Name"/> 
        <Binding /> 
       </PriorityBinding> 
      </TextBlock.Text> 
     </TextBlock> 

Si noti che questo rientra specificamente indietro quando la proprietà Name non è disponibile per l'oggetto essere legato; se la proprietà Name ha un valore stringa vuoto, credo che utilizzerà ancora quel valore vuoto.

+0

non è accettato ma i suoni della vostra soluzione grande ! –

+0

Prova:

+1

@Guillaume, Dylan modificato per mostrare il sintassi completa; in generale, '' è la sintassi XAML per l'impostazione del valore di una proprietà con un costrutto più complesso, piuttosto che un valore inline. L'estensione di markup '{Binding ...}' è solo una scorciatoia per creare queste istanze di classe 'Binding'. Il compilatore XAML esegue quindi un'ulteriore magia del caso speciale per realizzare che Text è una DependencyProperty, quindi consente al valore di essere "impostato" su un Binding, che gestisce chiamando le varie funzioni di BindingOperations necessarie per collegare le cose. –

0

Se non si dispone di legarsi al nome del tipo di oggetto è possibile utilizzare TargetNullValue che vi darà un valore predefinito se la proprietà bound è nullo, in questo modo:

<TextBlock Text="{Binding Name, TargetNullValue=Default}" /> 

Se si vuole veramente il nome del tipo di oggetto vorrei suggerire a scrivere un convertitore (implementare IValueConverter) Fatemi sapere se si desidera un convertitore campione

+0

Con il tuo codice, ho ancora TextBlocks vuoti quando i miei oggetti non hanno alcuna proprietà Name. Non so se è inteso o no. A proposito del convertitore, non lo so, mi sembra sorprendente che non lo facciamo semplicemente nel file xaml! –

+0

Il collegamento delle proprietà fallirà in questa situazione, quindi TargetNullValue non verrà mai utilizzato. Non è possibile avere un valore nullo per la destinazione se non si è riusciti a legarsi alla destinazione. –

+0

Siamo spiacenti, non ho capito che mancava la proprietà, pensavo fosse null ("se Nome è vuoto"). Colpa mia. –

0

questo.. è teorico ma ..

Vorrei creare uno stile personalizzato e scegliere come target tutti i blocchi di testo. All'interno del tuo stile, puoi impostare un valore di testo predefinito. Se l'associazione non sostituisce lo stile, verrà utilizzato il valore predefinito.

Style x:Key="TwitterTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="" /> 
+0

Voglio che il valore predefinito sia un altro Binding, non un valore statico :( –

3

È possibile applicare uno stile con un DataTrigger:

<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Text" Value="{Binding Name}"/> 
      <Style.Triggers> 
       <!-- In this binding you could inject a converter which checks for more than null --> 
       <DataTrigger Binding="{Binding Name}" Value="{x:Null}"> 
        <Setter Property="Text" Value="{Binding}"/> 
       </DataTrigger> 
      <Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

Sembra funzionare ma devo sapere qualcosa per essere sicuro, quando uso solo {Binding}. A quale proprietà il campo è associato? –

+0

@Guillaume, '{Binding} 'significa utilizzare il valore del DataContext corrente come valore da assegnare alla proprietà, in altre parole un percorso vuoto significa semplicemente utilizzare l'istanza dell'oggetto stessa piuttosto che una delle sue proprietà. Sintassi vincolante: http://www.nbdtech.com/Free/WpfBinding.pdf –

+1

@GuillaumeCogranne {Binding} si collegherà a qualsiasi contesto di dati corrente impostato.Quindi, anziché legarsi alla proprietà Name di una classe, ci si lega alla classe che contiene la proprietà Name. –

Problemi correlati