2012-06-13 21 views
14

Jak wiadomo StringFormat ma wielkie znaczenie dla reprezentacji danych w WPF. Mój problem polega na użyciu StringFormat podczas multibinding w WPF?Jak używać stringformat w multibinding w WPF XAML

Jeśli dam bardzo prosty przykład:

Mamy zmiennych, które są A i B, i których wartości są 10,255555 i +25,6999999

I chcemy im 10.2,25.6 pokazać?

W jaki sposób mogę to zrobić przy użyciu funkcji multibinding? Zwykle jest to bułka z masłem z ValueConverter

Każda pomoc i pomysły na ten temat zostaną greately docenione

Odpowiedz

48

Wystarczy ustawić właściwość StringFormat na MultiBinding; używają zastępcze ({0}, {1} ...) dla każdego wiązanie w MultiBinding i obejmują specyfikacje dotyczące formatowania jeśli jest to konieczne (np F1 liczby dziesiętnej z cyfrą 1 miejsca po przecinku)

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="{}{0:F1}{1:F1}"> 
      <Binding Path="A" /> 
      <Binding Path="B" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

{} części na początkiem jest ciąg formatujący, który jest sekwencją specjalną (w przeciwnym razie analizator składni XAML uznałby { za początek rozszerzenia znaczników).

+0

Cóż, za twoją szybką odpowiedź, ale czy możesz to krótko wyjaśnić, jeśli jest to możliwe w twojej odpowiedzi? – ibrahimyilmaz

+0

@ibrahimyilmaz, przepraszam, myślałem, że kod był oczywisty ... Dodałem krótkie wyjaśnienie. –

6

Aby uprościć, można użyć dwóch bloków tekstowych/etykiet do wyświetlenia wartości.

Jeśli używasz .Net4 można wiązać w elemencie Run Inline TextBlock

<TextBlock> 
    <Run Text="{Binding A, StringFormat={}{0:F1}}"/> 
    <Run Text="{Binding B, StringFormat={}{0:F1}}"/> 
</TextBlock> 
+0

Pomiędzy 2 'Run's będzie spacja. To nie jest podobne do 'StringFormat =" {} {0: F1} {1: F1} "' wspomnianego powyżej. Nawet wpisanie '' zakończy się powodzeniem tylko dopóki nie sformatujesz XAML (jak robi to ReSharper) i skończysz w ' [CRLF] [CRLF] ' – Marcel

4

Jeśli ktoś szuka „formaty czasu” To jest dla 24hr zegar, który jest, jak doszedłem do tego po:

<TextBlock TextAlignment="Center"> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="{}{0:HH:mm} - {1:HH:mm}"> 
      <Binding Path="StartTime" /> 
      <Binding Path="EndTime" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

początkowe 0: 1: to odniesienie do Wiązania

[0 hH: mM tt] wyświetlanie AM/PM