2009-09-09 12 views
9

Szukam czegoś wzdłuż tych linii:Jak wstawić powiązanie w środku zdania bloku TextBlock w WPF?

<TextBlock 
    Grid.Column="1" 
    Text="Welcome, {Binding UserName}!" /> 

Będzie to oczywiście faktycznie wyświetlić tekst „{Binding username}” dla użytkownika zamiast dekodować go, ale wiem, że można zrobić coś takiego z ASP.NET, więc mam nadzieję, że istnieje sposób, aby to działało w WPF.

Jestem już świadomy, że mogę użyć IValueConverter ... Szukam czegoś, co mogę zrobić wyłącznie w znacznikach, jeśli to możliwe.

EDIT:

podstawie najbardziej doskonałe rozwiązanie @Matt Hamiltona, próbowałem wcisnąć kopertę i wiążą dwie wartości w tym samym TextBlock użyciu MultiBinding. Działa jak czar:

<TextBlock 
    Style="{StaticResource TextBlock_ValueStyle}" 
    Grid.Column="1"> 
    <TextBlock.Text> 
     <MultiBinding 
      StringFormat="{}Attempts: {0:G} of {1:G}"> 
      <Binding 
       Path="AttemptNumber" /> 
      <Binding 
       Path="AttemptCount" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

produkuje to: Attempts: 1 of 4 (zakładając AttemptNumber = 1 i AttemptCount = 4).

Ja również znaleźć ten link pomocne dla zastanawianie się, który formatuje umieścić po dwukropku:

http://msdn.microsoft.com/en-us/library/fbxft59x.aspx

Odpowiedz

15

Można użyć właściwości StringFormat wiążącej w .NET 3.5 SP1:

<TextBlock Text="{Binding UserName,StringFormat='Welcome, \{0\}!'}" /> 

Pamiętaj, że musisz uciec nawiasy klamrowe w formacie ciągu odwrotnym ukośnikiem.

Aktualizacja Tak, wspiera wiele wartości są również:

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="Welcome, {0} {1}!"> 
      <Binding Path="FirstName" /> 
      <Binding Path="LastName" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
+0

Whee, to miłe. Jednak kolejność jest dziwna, ponieważ jest dokładnie odwrotna niż zwykle [string] :: Format. – Joey

+0

Piękne! Prowadzi mnie to do innego pytania: czy możliwe jest posiadanie wielu powiązanych wartości lub czy jesteś ograniczony do jednego? Dzięki. – devuxer

+0

Odpowiedziałem na moje własne pytanie (zobacz moją edycję). – devuxer

0

Do tej pory nie wiem o rozwiązanie, które sprawia, że ​​jest to możliwe w taki sam sposób, jak opisujesz to. Można jednak, jako obejście, korzystać z wielu bloków tekstowych poskładać swoje zdanie:

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Welcome, "/> 
    <TextBlock Text="{Binding UserName}"/> 
    <TextBlock Text="!"/> 
</StackPanel> 

To, co kiedyś tak daleko, a jednocześnie kłopotliwe wpisywanie wydaje się być najprostszym rozwiązaniem. Ale gdy tylko potrzebujesz internacjonalizacji, z oczywistych względów nie ma wyjścia.

+0

Użyłem 'StackPanel' ciąg razem par atrybut-wartość (na przykład przed„Status: Successful”), ale byłem trochę nieufny, aby użyć go do ciągów razem różnych częściach zdania, ponieważ Pomyślałem, że naturalny odstęp tekstowy może nie zostać zachowany (tzn. Będziesz miał większe przerwy między 'TextBlocks' niż między słowami tego samego' TextBlock' .Jeśli to nie okaże się problemem, to jest to dobre rozwiązanie – devuxer

+0

Do tej pory nie zauważyłem żadnej dodatkowej przestrzeni, ale kerning najprawdopodobniej nie zadziała tak jak automatyczne ligatury itp. Zasadniczo dzielisz tekst na różne biegi i wątpię, aby działała na nich zaawansowana typografia, ale dla niektórych projektów część i18n jest dość poważny i unikam łączenia łańcuchów i zmiennych lub używania łańcuchów tekstowych w dowolnym miejscu. Czasami zachowuje się szybkie i brudne rozwiązanie, takie jak :-) – Joey

0

Zapraszamy do obejrzenia tej biblioteki "WPFix". Umożliwia użytkownikowi zapisywanie wyrażeń lambda w XAML. Nie użyłem go w kodzie produkcyjnym, tylko w kodzie demo. Byłem w stanie przyjąć szerokość formularza, podzielić go na dwa i powiązać wartość z formantem. Zazwyczaj podczas opisywania musisz utworzyć klasę konwertera. Ta biblioteka może być rzeczą szukasz:

http://www.fikrimvar.net/lestirelim/?p=15

1

Jest to najprostszy sposób, aby mieszać tekst i kontroluje

<TextBlock>Welcome, <TextBlock Text="{Binding UserName}"/>!</TextBlock> 

można inline urządzone przyciski lub inne zabezpieczenia do.

1

Najlepszym sposobem na to jest korzystanie z Runs ...

<TextBlock> 
    <Run Text="Welcome"/> 
    <Run Text="{Binding UserName}"/> 
    <Run Text="!"/> 
</TextBlock> 
Powiązane problemy