2010-10-26 12 views
6

Ich habe Formatzeichenfolgen in meinen Ressourcendateien. Ich versuche, diese aus dem Text Attribute TextBlock- mit Formatstring für den Zugriff aufStringFormat in silverlight Xaml und Ressourcen

Text="{Binding Path=Project.Name, StringFormat={Binding Path=WkStrings.DisplayProjectName, Source={StaticResource ResourceWrapper}}}" 

ich die folgende Störung erhalte:

Provide value on 'System.Windows.Data.Binding' threw an exception 

Fehlerpunkte in Text =.

Ist es möglich, auf Ressourcen von einer "verschachtelten Bindung" zuzugreifen?

Antwort

8

Binding.StringFormat ist kein Abhängigkeitseigenschaft und daher können Sie keine Bindung für diese Property festlegen bitter. Wenn Sie einen Wert dieser Eigenschaft zuweisen möchten, muss Ihr Wert eine statische Ressource sein, wie folgt aus:

<TextBlock Text="{Binding ProjectName, StringFormat={StaticResource ProjectNameFormat}}"/> 

Sie sollten Ihre Ressource wie folgt erklären:

<UserControl.Resources> 
    <System:String x:Key="ProjectNameFormat">Project: {0}</System:String> 
</UserControl.Resources> 

Das Endergebnis sieht aus wie dies:

Resource String Format

+0

Ich muss Bewahren Sie die Formatbezeichner an einem Ort auf, der sie über die gesamte Anwendung zugänglich macht und * "lokalisierbar" *. Wie würde ich das erreichen? Die einzige Lösung, die ich mir im Moment vorstellen kann, ist ein Wrapper um die Ressourcenmanager (etwas wie ein Locator), was meiner Meinung nach ein wenig Overkill ist. – Nasser

+0

Am Ende haben wir sie über das ViewModel-System verfügbar gemacht. Wir haben einen Aggregator für diese Art von Formatierern als eine Eigenschaft des Basisansichtsmodells für das Projekt und so haben Blend-Benutzer sie alle auf dem richtigen Weg - jeder Ansicht - verfügbar, da alle Ansichtsmodelle von dieser Basis abgeleitet sind. Wenn der Zeichenfolgenbibliothek neue Formatter hinzugefügt werden, wird der Aggregatorklasse eine Wrapper-Eigenschaft hinzugefügt, die sie anwendungsweit verfügbar macht.Es ist ein bisschen übertrieben, aber es funktioniert. – Murven

1

Ihre Syntax ist falsch für die Verwendung von StringFormat und Sie möchten möglicherweise etwas anderes als StringFormat. StringFormat wird verwendet, um die Ausgabe dessen, was dem Pfad der Bindung zugewiesen ist, zu manipulieren. In Ihrem Beispiel binden Sie sich an die Eigenschaft Project.Name.

StringFormat sollte verwendet werden, um einen ähnlichen Effekt zu erzielen wie die Verwendung von String.Format im Code. Sehen Sie diese Referenz für die Formatierung: http://msdn.microsoft.com/en-us/library/26etazsy(v=VS.95).aspx

Andere Antworten rund um dieses Thema:

Does Silverlight support StringFormat in binding?

http://blog.davemdavis.net/2009/12/03/silverlight-4-data-binding-string-format/

Hier einige Beispiel-Code der Verwendung String:

<TextBlock Text="{Binding Path=Cost, StringFormat=\{0:c\}}" /> 
+0

der Gehalt an Binding Path = WkStrings.DisplayProjectName, Source = {Static ResourceWrapper}} ist eigentlich ein Formatbezeichner (so etwas wie „Projekt: {0} "). Was seltsam ist, ist, dass ich die Zeichenfolge aus der Resx-Datei lesen kann, aber nicht ihren Inhalt als Formatbezeichner für die Funktion FormatString verwenden. Wo kann ich meine Formatspezifizierer speichern (obwohl sie global verfügbar sind)? – Nasser

+0

Ah, ich sehe was du jetzt versuchst. Ich bin mir nicht sicher, ob das unterstützt wird. Im Moment würde ich wahrscheinlich vorschlagen, den formatierten Text als eine Eigenschaft eines ViewModels auszusetzen. Oder verwenden Sie eine Multi-Bindung und einen Konverter, um die beiden zusammenzufügen. Siehe diesen Beitrag: http://www.scottlogic.co.uk/blog/colin/2009/06/silverlight-multibindings-how-to-attached-mutiple-bindings-to-a-single-property/ –

Verwandte Themen