Как я могу снабдить префиксом связанные значения в средствах управления TextBlock в StackPanel, не используя отдельные средства управления для префиксов?
Например, скажем, у меня есть диалоговое окно, которое использует TreeView для отображения списка книг, при этом главные узлы являются заголовком и рядом зависимых узлов для других книжных атрибутов (ISBN, Автор, и т.д.).
У меня есть привязка, работающая правильно, но мой пользователь хочет, чтобы книжный список атрибутов сложил вертикально, и, очевидно, он хочет, чтобы каждый узел атрибута имел описательный префикс перед значением (например, "Автор: Erich Gamma" вместо просто "Erich Gamma"). В моем HDT и элементах DT, я использую средства управления StackPanel и TextBlock для отображения значений.
Я должен использовать отдельное управление TextBlock для префикса каждого атрибута
<!-- Works, but requires 2 controls to display the book author and the prefix stacks above the author -->
<TextBlock Text="Author: "/><TextBlock Text="{Binding Path=Author}" />
или есть ли способ сделать это с единственным управлением TextBlock для каждого узла?
<!-- only one control, but doesn't work -->
<TextBlock Text="Author: {Binding Path=Author}" />
Я знаю, что это должно быть распространенной проблемой, и я Погугленный для нее и искавший в трех WPF заказываю, я имею, но я предполагаю, что не знаю правильный способ искать то, что я пытаюсь сказать.
Спасибо!
Если у вас .Net 3.5 SP1, вы можете легко добиться этого с помощью StringFormat
<TextBlock Text="{Binding Path=Title, StringFormat= Title: {0}}" />
Вы также можете сделать это
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="Author: {0}, Title: {1}">
<Binding Path="Author"/>
<Binding Path="Title"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Если вы не используете SP1, тогда вы можете использовать ValueConverter
Быстрый грязный и простой метод: используйте преобразователь и передайте текст префикса в качестве параметра преобразователя. Затем в конвертере все, что вам нужно сделать, это добавить текст параметра конвертера к тексту привязки.
<TextBlock Text="{Binding Path=Title, Converter={StaticResource MyTextConverter}, ConverterParameter=Title}" />
<TextBlock Text="{Binding Path=ISBNNumber, Converter={StaticResource MyTextConverter}, ConverterParameter=ISBN}" />
<TextBlock Text="{Binding Path=AuthorName, Converter={StaticResource MyTextConverter}, ConverterParameter=Author}" />
public class MyTextConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is string)
{
return string.Format("{0}{1}{2}", parameter ?? "", !string.IsNullOrEmpty(parameter) ? " : " : "", value);
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Это было прямо у меня в голове, извините за любые мелкие ошибки в этом. Для этого используется всего один текстовый блок. Все, что вам нужно сделать, это включить конвертер в статические ресурсы файла xaml.