XAML Binding concatenazione di stringhe
-
18-09-2019 - |
Domanda
Ho un Person
oggetto, che ha FirstName
e LastName
proprietà.
Nel mio WPF UI, ho un Label
che ha bisogno di legarsi al nome completo:
<Label Binding="{Binding FullName}" />
Non voglio creare un'altra proprietà di sola lettura come:
public string FullName { get { return FirstName + " " + LastName; } }
Come posso concatenare queste due proprietà in XAML?
Soluzione
Un paio di opzioni:
Opzione 1: TextBlock singolo (o l'etichetta) con un MultiBinding:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Opzione 2: TextBlocks multiple (o etichette) in uno StackPanel orizzontale:
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
Personalmente mi piacerebbe andare con l'opzione 1.
Altri suggerimenti
Mi piace l'approccio MultiBinding Matt descritto. Tuttavia, vorrei anche sottolineare che a seconda dell'architettura della vostra applicazione creare la proprietà FullName che non volevi creare è una (e forse una più desiderabile) scelta ugualmente validi.
Se si sta utilizzando Model-View-ViewModel, si avrebbe un ViewModel che esporre una proprietà FullName per il solo scopo di legare alla vista.
Per esempio, se i requisiti improvvisamente cambiato in modo tale che avete bisogno di essere in grado di formattare come Primo + Ultimo o Cognome, Nome a seconda della configurazione impostazione sarebbe molto più facile da fare sul ViewModel. Allo stesso modo, crei un'unit test per convalidare che un cambiamento di Cognome FirstName o comporta anche una variazione appropriata FullName non è pratico utilizzando l'approccio XAML rettilineo.
Ma come ho detto tutto dipende l'architettura della vostra applicazione.