XAML concatenação Binding
-
18-09-2019 - |
Pergunta
Eu tenho um Person
objeto, que tem FirstName
e LastName
propriedades.
Na minha WPF UI, eu tenho um Label
que precisa para se ligar ao nome completo:
<Label Binding="{Binding FullName}" />
Eu não quero criar outra propriedade somente leitura como:
public string FullName { get { return FirstName + " " + LastName; } }
Como posso concatenar essas duas propriedades em XAML?
Solução
Um par de opções:
Opção 1: Única TextBlock (ou etiqueta) com um MultiBinding:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Opção 2: Múltiplas TextBlocks (ou etiquetas) em um StackPanel horizontal:
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
Pessoalmente, eu iria com a opção 1.
Outras dicas
Eu amo a abordagem MultiBinding Matt descrito. No entanto, gostaria também de salientar que, dependendo da arquitetura do seu aplicativo criando a propriedade FullName que você não deseja criar é uma (e sem dúvida uma mais desejável) escolha igualmente válidas.
Se você estava usando Model-View-ViewModel, você teria um ViewModel que iria expor uma propriedade FullName com o único propósito de ligar para a vista.
Por exemplo, se os requisitos de repente mudou de tal forma que você precisava para ser capaz de formatá-lo como Primeiro + Última ou Sobrenome, dependendo de uma definição que seria muito mais fácil de fazer no ViewModel configuração. Da mesma forma, escrever um teste de unidade para validar que uma mudança para FirstName ou LastName também resulta em uma mudança apropriada no FullName não é prático usar a abordagem XAML reta.
Mas como eu disse, tudo depende da arquitetura de sua aplicação.