2016-05-16 10 views
9

Ist es möglich, statischen Text und einen bindbaren Kontext in demselben Label zu haben?Zeichenfolge mit Bindungen verketten XAML

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

Außer dieser Displays als „$ {Totalcost Binding}“

Ich weiß, ich könnte nur leicht das Feld gesetzt durch so etwas wie totalCost.Text = String.Format("${0}", totalCost); zu tun, sondern wollte nur sehen, ob es möglich war, die andere Art und Weise

Antwort

24

sehen, ob dies für Sie arbeitet:

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

Verschiedene XAMLS unterscheiden können, aber ich würde StringFormat in ein Binding erwarten funktioniert nur, wenn die Zieleigenschaft der Bindung vom Typ String ist. In WPF zum Beispiel funktioniert es für TextBlock.Text, aber nicht für Label.Content, die vom Typ Object ist. Aus diesem Grund versagt es oft leise, was sehr ärgerlich sein kann, wenn Sie mit dieser kleinen Sprengfalle nicht vertraut sind.

Eine weitere praktische Sache, zu wissen: ContentControl und seine zahlreichen Nachkommen (Label, etc) eine ContentStringFormat Eigenschaft, die Content in einen String und Formate es nötigt. HeaderedItemsControl (Basisklasse von MenuItem, etc) und HeaderedContentControl (Basisklasse von GroupBox usw.) haben jeweils eine HeaderStringFormat property, die das gleiche für ihre jeweiligen Header Eigenschaften tut.

+0

Vielen Dank! Das hat tatsächlich für mich funktioniert. Ich werde Ihre Antwort in 5 Minuten akzeptieren, wenn es mir erlaubt. – John

+2

@Shane Gute Nachrichten! –

3

Obwohl die ausgewählte Antwort korrekt ist, ignorieren Sie Kommas in Ihren Währungswerten oder dem möglichen Zeitraum. Ein besserer Weg wäre, eine get-Eigenschaft verfügbar zu machen, die den passenden Wert für die Bindung liefert. Unten ist ein Codeausschnitt für jedermann in der Zukunft

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

In Ihrem Ansichtsmodell

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

Sie immer daran denken, kann nur eine get Eigenschaft in Ihrem ViewModel erstellen, die einige Daten aussetzt. Rufen Sie OnPropertyChanged oder wie auch immer Ihre Methode aufgerufen wird, die Ihre INotifyPropertyChanged Schnittstelle implementiert. Wenn Sie die Cents auf Ihrem Dollar-Wert wollen, ändern Sie "C0" auf nur "C".

0

Ich denke, die .NET-Art zu tun, was Sie wollen, die Format Wert Zeichenfolge als Währung ist.

Nutzt die Bindungseigenschaft StringFormat zusammen mit dem Currency Format Specifier:

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

Code wie folgt

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

Prost aussehen würde.

Verwandte Themen