Простой WPF форматирование вопроса

Как я могу снабдить префиксом связанные значения в средствах управления 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 заказываю, я имею, но я предполагаю, что не знаю правильный способ искать то, что я пытаюсь сказать.

Спасибо!

5
задан Minnow Noir 3 March 2010 в 13:02
поделиться

2 ответа

Если у вас .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

7
ответ дан 13 December 2019 в 22:06
поделиться

Быстрый грязный и простой метод: используйте преобразователь и передайте текст префикса в качестве параметра преобразователя. Затем в конвертере все, что вам нужно сделать, это добавить текст параметра конвертера к тексту привязки.

<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.

3
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: