Laden...

XAML TextBlock DataBinding - formatierter Text

Erstellt von bibL vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.877 Views
B
bibL Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren
XAML TextBlock DataBinding - formatierter Text

Ich habe ein Template für mein ListBoxItem nach folgendem Schema erstellt und an die Properties meiner "Daten"-Klasse gebunden,
welche ich dann den Items der ListBox hinzugefügt habe.
Was alles wunderbar funktioniert hat.

<ControlTemplate TargetType="{x:Type ListBoxItem}">
<StackPanel>
...
<TextBlock Text="{Binding Path=Hinweis}" />
...
</StackPanel>
</ControlTemplate>

public class BETEintrag {
...
public string Hinweis {
get { return bet_hinweis; }
...

Bislang handelte es sich bei "Hinweis" um einen String,
welches jetzt jedoch unterschiedlich fett-, kursiv- ect. formatierten Text enthalten soll.

Die Frage ist nun, Ist es möglich über ein Binding formatierten Text in ein Template einzubinden, wenn ja wie?

N
19 Beiträge seit 2005
vor 17 Jahren

Hoi, also ich bin ja auch noch recht neu, aber

<TextBlock Text="{Binding Path=Hinweis}" FontSize="{Binding Path=FontSize}" />

sollte möglich sein, wenn du in deiner Collection so nen Feld anlegst (Property).

Aber ist nun auch net getestet, bin grade nur zufällig hier am rumstöbern.

B
bibL Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren

Es geht mir darum Text wie:

Dies ist ein teilweise fett und kursiv formatierter Text

an einen TextBlock zu binden

6.862 Beiträge seit 2003
vor 17 Jahren

Das ist so einfach nicht möglich, da nen String nur nen Datencontainer für die Zeichen ist. Da sind keinerlei Angaben zur Formatierung angegeben. Die musst du erstmal zusätzlich mitgeben, sprich nur nen String Property reicht nicht aus.

Ich nehme an du hast das Windows SDK installiert? Falls nein, unbedingt nachholen, da gibts zig Beispiele dazu. Schau dich mal nach der FormattedText Klasse um.

Trotzdem wird es nicht so einfach per DataBinding gehen, evtl. kann man noch mit nem eigenen Dataconverter was machen, glaub ich aber nicht so wirklich.

Im Endeffekt ist ein String als einzelnes glaub ich überhaupt nicht geeignet. Wie wäre es als Beispiel damit: Im Moment hast du ja einen String den du verschieden formatiert darstellen willst. Wie wäre es den einfach schon in der Collection auseinanderzutüdeln, und jeden Teilstring mit der entsprechenden Formatierung in Labels zeichnen. Und die Collection gibt die einzelnen Labels zurück(sprich im Endeffekt schon die formatierten Strings) und die Collection bindest du dann mit den Labels an irgend ein Containercontrol, und dort wird dann der formatierte String angezeigt.

Okay, je nachdem was man noch damit vorhat ist die Methode nen verdammt schlechter Workaround, deshalb würd ich dir doch dringenst empfehlen mit der FormattedText Klasse zu arbeiten, die ist nämlich für genau sowas gemacht.

Baka wa shinanakya naoranai.

Mein XING Profil.

B
bibL Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren

Das mit dem Strring ist mir klar.

Will nochmals zusammenfassen was ich vor hab:

Ich habe eine ListBox mit einem ItemTemplate für meine Datenklasse welches ein TextBlock zur Anzeige eines formatierten Textes verwendet.

Jedes TextBlock Objekt hat ein Propertie welches eine InlineCollection beinhaltet welchem Objekte vom Typ Inline wie Bold, Italic ect. hinzugefügt werden können.

Deswegen war mein erstes Ansatz ein Propertie vom Typ InlineCollection in meiner Datenklasse zu erstellen. Leider habe ich keinen Weg gefunden eine Sammlung dieser Inline Objekte mittels Binding an meinen TextBlock zu verknüpfen.

Ich weiss erst zu Laufzeit wie die Texte formatiert werden.

Als Beispiel für solch einen Text der unterschiedlich lang und unterschiedlich formatiert sein kann:

"Dies ist ein fett und kursiv formatierter Text"

Würde ich ihn fest in meine XAML Datei einbinden würde das Ergebnis so aussehen:

<TextBlock>
<Run>Dies ist ein </Run>
<Bold>fett</Bold>
<Run> und </Run>
<Italic>kursiv</Italic>
<Run> formatierter Text</Run>
</TextBlock>

Oder Programmatisch:

myTextBox.Inlines.Add(new Run("Dies ist ein "));
myTextBox.Inlines.Add(new Bold(new Run("fett")));
usw.

Ich suche aber nach einer Möglichkeit das selbe Ergebnis über ein einfaches Binding auf ein Propertie meiner Datenklasse zu erreichen, falls dies überhaupt möglich ist. Da es sich um zeitintensive Verarbeitung (Semantische Vergleiche von mehreren 1000 Texten) handelt nach dem der Text formatiert wird, sollte dieser schon fertig formatiert im Propertie einer Datenklasse (Natürlich beinhaltet die Datenklasse auch noch viel andere Daten die im Zusammenhang mit dem Text stehen) gespeichert werden können und vorliegen.