2010-03-31 17 views
146

Attualmente sto usando il TextBlock di seguito per associare il valore di una proprietà denominata Name:Come associare più valori a un singolo TextBlock WPF?

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

Ora, voglio legare un'altra proprietà denominata ID allo stesso TextBlock.

È possibile associare due o più valori allo stesso TextBlock? Può essere fatto con una semplice concatenazione, come Name + ID e, in caso contrario, in quale altro modo si potrebbe arrivare?

risposta

323

è possibile utilizzare un MultiBinding combinato con la proprietà StringFormat. Uso sarebbe simile al seguente:

<TextBlock> 
    <TextBlock.Text>  
     <MultiBinding StringFormat="{}{0} + {1}"> 
      <Binding Path="Name" /> 
      <Binding Path="ID" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

dato un valore di nome di Foo e un valore per l'ID di 1 voi uscita in TextBlock sarebbe Foo + 1.

Note: che questo è supportato solo in .NET 3.5 SP1 e 3.0 SP2 o successivo.

+6

OUt di interst cosa fa il {} nel formato? –

+5

@Preet - In realtà non sono sicuro se il '{}' sia necessario in questo caso, l'ho incluso dal momento che è stato utilizzato sull'esempio MSDN. In generale, tuttavia, è necessario come sequenza di escape per il parser XAML per evitare confusione con l'estensione del markup Binding. –

+1

C'è un effetto collaterale su questo. Se si utilizza questo metodo in qualcosa come un 'DataGrid', il comportamento di ordinamento purtroppo non funziona.Una soluzione più appropriata sarebbe quella di creare una proprietà di sola lettura nel modello con il formato di stringa appropriato da associare. Inutile dire che questo è un modo semplice per formattare rapidamente anche se un po 'prolisso. –

9

Utilizzare un ValueConverter

[ValueConversion(typeof(string), typeof(String))] 
public class MyConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.Format("{0}:{1}", (string) value, (string) parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     return DependencyProperty.UnsetValue; 
    } 
} 

e nella marcatura

<src:MyConverter x:Key="MyConverter"/> 

. . .

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" /> 
+0

Funziona? Dove sei vincolante con ID? – waxingsatirical

+0

Sì - questo è stato scritto 6 anni fa e si sta vincolando il "Nome" come primo argomento del convertitore (chiamato valore nel codice) e l'ID (una stringa dalla domanda) come secondo argomento. –

16

Se questi saranno solo blocchi di testo (e quindi unidirezionali) e si desidera semplicemente concatenare i valori, è sufficiente associare due blocchi di testo e inserirli in uno stackpanel orizzontale.

<StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Name}"/> 
     <TextBlock Text="{Binding ID}"/> 
    </StackPanel> 

Questo visualizzerà il testo (che è fatto da tutti i blocchi di testo) senza dover fare altro codice. Si potrebbe mettere un piccolo margine su di loro per farli sembrare giusto però.

98

So che è un po 'tardi, ma ho pensato di aggiungere un altro modo per farlo.

È possibile sfruttare la proprietà Text con "Run s", in modo da poter impostare più binding utilizzando una Run per ognuno. Ciò è utile se non si ha accesso a MultiBinding (che non ho trovato durante lo sviluppo per Windows Phone)

<TextBlock> 
    <Run Text="Name = "/> 
    <Run Text="{Binding Name}"/> 
    <Run Text=", Id ="/> 
    <Run Text="{Binding Id}"/> 
</TextBlock> 
+3

Questo è un approccio molto pratico da utilizzare quando si esegue il binding a più stringhe che sono originate come DynamicResource come è possibile usare una MultiBinding con StringFormat per quello. – slugster

+6

Funziona solo con .NET 4.0+ – Doug

+0

Ho appena provato questo. Funziona, tuttavia ogni elemento (anche la geometria) che viene disegnato (su un aggiornamento) ora lampeggia ogni tick per qualche motivo. Andando a provare l'altro metodo. –

Problemi correlati