Простой вопрос форматирования WPF - PullRequest
5 голосов
/ 03 марта 2010

Как можно задать префиксные значения в элементах управления TextBlock в StackPanel без использования отдельных элементов управления для префиксов?

Например, допустим, у меня есть диалоговое окно, которое использует TreeView для отображения списка книг, где верхние узлы являются заголовком, а также набор подчиненных узлов для других атрибутов книги (ISBN, Автор и т. Д.).

У меня привязка работает правильно, но мой пользователь хочет, чтобы список атрибутов книги располагался вертикально, и, очевидно, он хочет, чтобы каждый узел атрибута имел описательный префикс перед значением (например, «Автор: Эрих Гамма» вместо просто "Эрих Гамма"). Внутри элементов 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, но, думаю, я не знаю, как правильно искать то, что я пытаюсь сказать.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 03 марта 2010

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

2 голосов
/ 03 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...