2016-05-16 5 views
9

Возможно ли иметь некоторый статический текст и связующий контекст на одной и той же этикетке?Строка конкатенации с привязками XAML

<Label Text = "${Binding totalCost}" 
     x:Name = "totalCost" 
     HorizontalOptions = "Start" 
     VerticalOptions = "Start" 
     Grid.Row = "6" Grid.Column = "1"/> 

Кроме этого дисплеях, как «$ {Binding TotalCost}»

Я знаю, что я мог бы просто легко установить поле, делая что-то вроде totalCost.Text = String.Format("${0}", totalCost); но просто хотел, чтобы увидеть, если это было возможно, по-другому

ответ

24

Смотрите, если это работает для вас:

Text="{Binding totalCost, StringFormat='${0}'}" 

Различные XAMLS могут отличаться, но я ожидал бы StringFormat в Binding работать, только если целевое свойство привязки имеет тип String. Например, в WPF он работает для TextBlock.Text, но не для Label.Content, который имеет тип Object. По этой причине он часто терпит неудачу, что может быть очень неприятным, если вы не знакомы с этой маленькой ловушкой.

Еще одна удобная вещь, чтобы знать: ContentControl и многие его потомки (Label и т.д.) имеет ContentStringFormat свойство, принуждают Content в строку и форматирует его. HeaderedItemsControl (базовый класс MenuItem и т. Д.) И HeaderedContentControl (базовый класс GroupBox и т. Д.) Каждый имеет HeaderStringFormat property, который делает то же самое для своих соответствующих Header объектов.

+0

Спасибо! Это действительно помогло мне. Я отвечу на ваш ответ через 5 минут, когда это позволит мне. – John

+2

@Shane Хорошие новости! –

3

Хотя выбранный ответ верен, вы будете игнорировать запятые в своих валютных значениях или потенциальном периоде. Лучшим способом было бы открыть свойство get, которое обеспечивает соответствующее значение для привязки. Ниже приведен фрагмент кода для тех, кто в будущем

<Label Text = "${Binding TotalCostFormatted}" 
     x:Name = "totalCost" 
     HorizontalOptions = "Start" 
     VerticalOptions = "Start" 
     Grid.Row = "6" Grid.Column = "1"/> 

В вашей ViewModel

double totalCost; 
public double TotalCost 
{ 
    get { return totalCost; } 
    set 
    { 
     totalCost = value; 
     OnPropertyChanged(nameof(TotalCostFormatted)); 
    } 
} 
public string TotalCostFormatted 
{ 
    get { return TotalCost.ToString("C0"); } 
} 

Помните, вы всегда можете просто создать get свойство в вашем ViewModel, который предоставляет некоторые данные. Позвоните по телефону OnPropertyChanged или независимо от вашего метода, который реализует ваш интерфейс INotifyPropertyChanged. Если вы хотите, чтобы цента находились на вашем долларовом значении, измените «C0» на «C».

0

Я думаю, что .NET способ делать то, что вы хотите, который является строкой значения формата в качестве валюты.

Пользуется свойство связывания StringFormat вместе с Currency Format Specifier:

Text="{Binding totalCost, StringFormat=\{0:C\}}" 

Ваш код будет выглядеть следующим образом

<Label Text="{Binding totalCost, StringFormat=\{0:C\}}" 
    x:Name = "totalCost" 
    HorizontalOptions = "Start" 
    VerticalOptions = "Start" 
    Grid.Row = "6" Grid.Column = "1"/> 

Приветствия.

Смежные вопросы