XAML Связывание строк связывания - PullRequest
4 голосов
/ 05 января 2010

У меня есть объект Person, который имеет свойства FirstName и LastName.

В моем интерфейсе WPF у меня есть Label, который необходимо связать с полным именем:

<Label Binding="{Binding FullName}" />

Я не хочу создавать другое свойство только для чтения, например:

public string FullName { get { return FirstName + " " + LastName; } }

Как объединить эти два свойства в XAML?

Ответы [ 2 ]

10 голосов
/ 05 января 2010

Пара вариантов:

Вариант 1: одиночный текстовый блок (или метка) с мультисвязью:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0} {1}">
            <Binding Path="FirstName" />
            <Binding Path="LastName" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Вариант 2: несколько текстовых блоков (или меток) в горизонтальной панели стека:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding FirstName}" />
    <TextBlock Text=" " />
    <TextBlock Text="{Binding LastName}" />
</StackPanel>

Лично я бы выбрал вариант 1.

4 голосов
/ 05 января 2010

Мне нравится подход MultiBinding, описанный Мэттом. Однако я должен также отметить, что в зависимости от архитектуры вашего приложения создание свойства FullName, которое вы не хотите создавать, является одинаково действительным (и, возможно, более желательным) выбором.

Если бы вы использовали Model-View-ViewModel, у вас была бы ViewModel, которая открывала бы свойство FullName с единственной целью привязать его к представлению.

Например, если требования внезапно изменились так, что вам нужно было иметь возможность отформатировать его как First + Last или Last, First, в зависимости от параметра конфигурации, это было бы намного проще сделать в ViewModel. Аналогично, написание модульного теста для проверки того, что изменение FirstName или LastName также приводит к соответствующему изменению FullName, нецелесообразно при использовании прямого подхода XAML.

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

...