Вопрос

у меня есть объект 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.

Но, как я уже сказал, все зависит от архитектуры вашего приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top