Объединение строк привязки XAML
-
18-09-2019 - |
Вопрос
у меня есть объект Person
, который имеет FirstName
и LastName
характеристики.
В моем пользовательском интерфейсе WPF у меня есть Label
который необходимо привязать к полному имени:
<Label Binding="{Binding FullName}" />
Я не хочу создавать еще одно свойство только для чтения, например:
public string FullName { get { return FirstName + " " + LastName; } }
Как объединить эти два свойства в XAML?
Решение
Несколько вариантов:
Опция 1:Одиночный текстовый блок (или метка) с мультипривязкой:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Вариант 2:Несколько текстовых блоков (или меток) в горизонтальной панели StackPanel:
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
Лично я бы выбрал вариант 1.
Другие советы
Мне нравится подход MultiBinding, описанный Мэттом.Однако я должен также отметить, что в зависимости от архитектуры вашего приложения создание свойства FullName, которое вы не хотели создавать, является столь же правильным (и, возможно, более желательным) выбором.
Если бы вы использовали Model-View-ViewModel, у вас была бы ViewModel, которая предоставляла бы свойство FullName с единственной целью — привязать его к представлению.
Например, если требования внезапно изменились так, что вам нужно было иметь возможность отформатировать его как First + Last или Last, First, в зависимости от параметра конфигурации, это было бы гораздо проще сделать в ViewModel.Аналогичным образом, написание модульного теста для проверки того, что изменение FirstName или LastName также приводит к соответствующему изменению FullName, нецелесообразно использовать прямой подход XAML.
Но, как я уже сказал, все зависит от архитектуры вашего приложения.