WPF Mixing Bound и Fixed текст в TextBox - PullRequest
       41

WPF Mixing Bound и Fixed текст в TextBox

7 голосов
/ 16 сентября 2009

У меня есть следующий код для отображения возраста клиентов.

<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" />

Однако вместо того, чтобы просто отображать только число, я хочу поставить перед ним префикс «Age» и добавить суффикс «yrs», чтобы он фактически стал «36 лет»

Я могу добиться этого с помощью горизонтальной StackPanel и 3 текстовых полей, но есть ли гораздо более простой метод, который мне не хватает?

Ответы [ 4 ]

8 голосов
/ 16 сентября 2009

Предполагая, что вам не нужно редактировать значение возраста, в WPF 4.0 свойство Text для Run будет привязанным, это, вероятно, не поможет вам прямо сейчас, если вы не используете предварительную версию, но сможете сделать что-то вроде следующего:

<TextBlock x:Name="txtClientAge" >
    <Run Text="Age "/><Run Text="{Binding Path=ClientAge}"/><Run Text=" Yrs"/>
</TextBlock>

ОБНОВЛЕНИЕ Вот еще одна альтернатива решению для форматирования строк, которое будет работать, но не особенно красиво (на самом деле это довольно забавно). Используйте следующий конвертер для привязки (при условии, что свойство ClientAge имеет тип int):

public class AgeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                          System.Globalization.CultureInfo culture)
    {
        string age = value.ToString();
        return "Age " + age + " years";
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              System.Globalization.CultureInfo culture)
    {
        string age = value as string;
        return Int32.Parse(age.Replace("Age ", " ").Replace(" years", ""));
    }
}
5 голосов
/ 06 октября 2011

Это довольно старый вопрос, но я думаю, что на данный момент это лучшее решение (если вы хотите редактировать текст).

Вы можете сделать это с InlineUIContainer в TextBlock с вложенным Textbox.

Примечание: я использовал BaselineAlignment="Center" для выравнивания компонентов. Вы также можете добавить положительные или отрицательные поля к TextBox при необходимости. Также я установил прозрачную границу TextBox, чтобы она выглядела как часть TextBlock, даже если она редактируема и выбираема.

<TextBlock Foreground="SteelBlue">
    <Run Text="Package Barcode:" FontWeight="Bold" BaselineAlignment="Center"/>
    <InlineUIContainer BaselineAlignment="Center">
        <TextBox Margin="2,0,0,0" Foreground="Gray" Text="{Binding BarcodeNumber}" BorderThickness="0" Padding="0"/>
    </InlineUIContainer>
</TextBlock>
5 голосов
/ 16 сентября 2009

Вы также можете создать свойство в классе, который вы связываете, которое создает текстовую строку, которую вы хотите отобразить.

Существует также маршрут StringFormat:

<textblock text="{Binding Path=mydate, StringFormat=d}"/>

Вы можете взломать константы в строку форматирования.

Я предпочитаю метод собственности.

1 голос
/ 08 октября 2015

Это как предыдущий ответ - (но они все с Texblocks ... так что здесь версия Textbox), я также хотел показать подход Multibinding. Чтобы заставить Texbox делать то, что вы хотите, вы можете использовать следующий код:

<TextBox>
 <TextBox.Text>
   <MultiBinding StringFormat="Age {0} yrs and {1} months">
     <Binding Path="Years" />
     <Binding Path="Months" />
   </MultiBinding>
 </TextBox.Text>
</TextBox>

Это может быть полезно, если вы хотите, чтобы ваш текст можно было выбирать, чтобы пользователь мог скопировать код.

...