2016-05-16 13 views
9

Czy w tej samej etykiecie można umieścić tekst statyczny i kontekst powiązania?Połącz ciąg z wiązaniami XAML

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

Poza tym wyświetlaczy jak „$ {Binding TOTALCOST}”

wiem, może po prostu łatwo ustawić pole wykonując coś jak totalCost.Text = String.Format("${0}", totalCost); ale po prostu chciałem zobaczyć, czy to możliwe w inny sposób

Odpowiedz

24

sprawdzić, czy to działa dla Ciebie:

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

Różne XAMLS mogą się różnić, ale spodziewałbym StringFormat w sposób Binding działa tylko wtedy, gdy docelowa właściwość wiązania jest typu String. Na przykład w WPF działa on pod numer TextBlock.Text, ale nie dla Label.Content, który jest typu Object. Z tego powodu często nie działa po cichu, co może być bardzo irytujące, jeśli nie znasz tej małej pułapki.

Kolejna przydatna rzecz wiedzieć: ContentControl a jego liczne potomstwo (Label itp) ma właściwość ContentStringFormat że wymusza Content na ciąg znaków i formatów nim. HeaderedItemsControl (klasa podstawowa MenuItem, itp.) I HeaderedContentControl (klasa podstawowa z GroupBox itp.) Mają po jednym HeaderStringFormat property, który robi to samo dla ich odpowiednich właściwości Header.

+0

Dziękujemy! To faktycznie działa dla mnie. Przyjmuję twoją odpowiedź w 5 minut, kiedy mi to pozwala. – John

+2

@Shane Dobre wieści! –

3

Mimo że wybrana odpowiedź jest prawidłowa, będziesz ignorować przecinki w swoich wartościach walutowych lub w potencjalnym okresie. Lepszym sposobem byłoby odsłonięcie właściwości get, która zapewnia odpowiednią wartość powiązania. Poniżej znajduje się fragment kodu dla każdego, kto w przyszłości

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

W swojej ViewModel

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

Pamiętaj, zawsze można po prostu utworzyć właściwość get w swoim ViewModel że odsłania pewne dane. Zadzwoń pod numer OnPropertyChanged lub inną dowolną metodę, która implementuje twój interfejs INotifyPropertyChanged. Jeśli chcesz centów za wartość dolara, zmień "C0" na "C".

0

Myślę, że .NET sposób robienia tego, co chcesz, który jest ciągiem wartości formatu jako waluty.

wykorzystuje właściwość wiązania StringFormat wraz z Currency Format Specifier:

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

Twój kod będzie wyglądać następująco

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

Cheers.

Powiązane problemy