2016-05-16 18 views
9

È possibile avere un testo statico e un contesto associabile nella stessa etichetta?Concatena stringa con associazioni XAML

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

tranne questo viene visualizzato come "$ {Binding totalcost}"

So che potrei appena facilmente impostare il campo facendo qualcosa di simile totalCost.Text = String.Format("${0}", totalCost); ma solo voluto vedere se era possibile il contrario

risposta

24

vedere se questo funziona per voi:

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

diversi XAMLS possono essere diversi, ma mi si aspetterebbe in un StringFormatBinding funzionare solo se la proprietà di destinazione dell'associazione è di tipo String. In WPF, ad esempio, funziona per TextBlock.Text, ma non per Label.Content, che è di tipo Object. Per questo motivo, spesso fallisce silenziosamente, il che può essere molto fastidioso se non si ha familiarità con quella piccola trappola esplosiva.

Un'altra cosa utile da sapere: ContentControl e dei suoi numerosi discendenti (Label, ecc) ha una proprietà ContentStringFormat che costringe Content in una stringa e formatta. HeaderedItemsControl (classe base MenuItem, ecc.) E HeaderedContentControl (classe base GroupBox ecc.) Hanno ciascuno un HeaderStringFormat property che fa lo stesso per le rispettive proprietà Header.

+0

Grazie! Questo ha funzionato di fatto per me. Accetterò la tua risposta tra 5 minuti quando me lo consente. – John

+2

@Shane Buone notizie! –

3

Sebbene la risposta selezionata sia corretta, si ignorano le virgole nei valori di valuta o nel periodo potenziale. Un modo migliore sarebbe esporre una proprietà get che fornisce il valore appropriato per l'associazione. Di seguito è riportato un frammento di codice per chiunque in futuro

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

Nel vostro ViewModel

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

vi ricordate può sempre e solo creare una proprietà get nel vostro ViewModel che espone alcuni dati. Chiama il numero OnPropertyChanged o qualunque sia il metodo che viene chiamato che implementa l'interfaccia INotifyPropertyChanged. Se vuoi i centesimi sul tuo valore in dollari, cambia "C0" in "C".

0

Sto pensando al modo .NET di fare ciò che vuoi, che è la stringa del valore di formato come valuta.

sta usando la proprietà di legame StringFormat insieme al Currency Format Specifier:

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

Il codice sarà simile a questa

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

Cin cin.