Хотя подход с DataTrigger работает, он очень многословен. Я хотел бы сделать это в два этапа: связать Type
отдельно с StringFormat, который имеет пробел, а затем связать все вместе
<TextBlock Name="Title"
local:Attached.SomeString="{Binding Type,
StringFormat='\{0} ',
TargetNullValue=''}">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:yyyy} · {1}{2}">
<Binding Path="Login" />
<Binding Path="(local:Attached.SomeString)"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Name" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Если тип не равен null
, то привязка SomeString использует формат строки и возвращает тип + пробел в конце. Если Тип null
, то привязка возвращает пустую строку.
SomeString - это свойство присоединенной зависимости многократного использования без особого значения. Объявлено как
public class Attached
{
public static readonly DependencyProperty SomeStringProperty =
DependencyProperty.RegisterAttached("SomeString", typeof (string), typeof (Attached));
public static void SetSomeString(UIElement element, string value)
{
element.SetValue(SomeStringProperty, value);
}
public static string GetSomeString(UIElement element)
{
return (string)element.GetValue(SomeStringProperty);
}
}
TextBlock имеет свойство Tag
, которое можно использовать для хранения (или связывания) некоторых данных, но Tag имеет тип object
и не использует StringFormat из привязки. Поэтому я не мог использовать Tag для своих целей, и мне пришлось создать другое свойство типа string
. (обратите внимание также на специальный синтаксис для привязки вложенного свойства)