2010-03-31 4 views
146

obecnie używam poniższego TextBlock powiązać wartość właściwości nazwie Name:Jak powiązać wiele wartości z pojedynczą blokadą tekstową WPF?

<TextBlock Text="{Binding Name}" /> 

Teraz chcę związać inny właściwość o nazwie ID do tej samej TextBlock.

Czy można powiązać dwie lub więcej wartości z tym samym TextBlock? Czy można to zrobić za pomocą prostej konkatenacji, takiej jak Name + ID, a jeśli nie, to w jaki inny sposób można się do tego zbliżyć?

Odpowiedz

323

Można użyć MultiBinding połączeniu z właściwością StringFormat. Wykorzystanie będzie wyglądać następująco:

<TextBlock> 
    <TextBlock.Text>  
     <MultiBinding StringFormat="{}{0} + {1}"> 
      <Binding Path="Name" /> 
      <Binding Path="ID" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Biorąc pod uwagę wartość Nazwa Foo i wartość ID 1 wypisujesz w TextBlock byłby Foo + 1.

Note: że jest to obsługiwane tylko w .NET 3.5 SP1 i 3.0 SP2 lub nowszym.

+6

OUt of interst co robi {} w formacie? –

+5

@Preet - Nie jestem pewien, czy "{}" jest w tym przypadku konieczne, uwzględniłem go, ponieważ był używany w próbce MSDN. Generalnie jest jednak potrzebny jako sekwencja escape dla parsera XAML, aby uniknąć pomyłki z rozszerzeniem Binding. –

+1

Istnieje jeden wpływ strony na to. Jeśli użyjesz tej metody w coś w stylu sortowania 'DataGrid' niestety nie działa.Bardziej odpowiednim rozwiązaniem byłoby utworzenie właściwości tylko do odczytu w modelu z odpowiednim formatem ciągu znaków, aby się z nim połączyć. Nie trzeba dodawać, że jest to dobry sposób na szybkie formatowanie, choć trochę gadatliwe. –

9

Użyj ValueConverter

[ValueConversion(typeof(string), typeof(String))] 
public class MyConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.Format("{0}:{1}", (string) value, (string) parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     return DependencyProperty.UnsetValue; 
    } 
} 

oraz w znacznikach

<src:MyConverter x:Key="MyConverter"/> 

. . .

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" /> 
+0

Czy to działa? Gdzie jesteś wiążący dla ID? – waxingsatirical

+0

Tak - napisano to 6 lat temu, a Ty nazywasz "Nazwę" pierwszym argumentem konwertera (nazywanym wartością w kodzie), a identyfikator (ciąg znaków z pytania) drugim argumentem. –

16

Jeśli po prostu będą to blokowanie tekstu (a więc jeden sposób wiązania), a po prostu chcesz połączyć wartości, po prostu połącz dwa bloki tekstowe i umieść je w poziomym panelu stosu.

<StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Name}"/> 
     <TextBlock Text="{Binding ID}"/> 
    </StackPanel> 

To spowoduje wyświetlenie tekstu (do czego służą tylko blok Textblocks) bez konieczności dalszego kodowania. Możesz umieścić na nich niewielki margines, aby wyglądał prawidłowo.

98

Wiem, że jest to opóźnienie, ale pomyślałem, że dodam jeszcze inny sposób.

Można skorzystać z faktu, że właściwość Text można ustawić za pomocą "Run s", aby można było skonfigurować wiele powiązań za pomocą polecenia Uruchom dla każdego z nich. Jest to przydatne, jeśli nie masz dostępu do funkcji MultiBinding (której nie znalazłem podczas pracy w systemie Windows Phone).

<TextBlock> 
    <Run Text="Name = "/> 
    <Run Text="{Binding Name}"/> 
    <Run Text=", Id ="/> 
    <Run Text="{Binding Id}"/> 
</TextBlock> 
+3

Jest to bardzo przydatne podejście do użycia podczas wiązania z kilkoma łańcuchami, które są pozyskiwane jako DynamicResource, tak jak można do tego celu użyj funkcji MultiBinding z StringFormat. – slugster

+6

Działa tylko z .NET 4.0+ – Doug

+0

Po prostu próbowałem tego. Działa, jednak każdy element (geometria równomierna), który zostanie narysowany (po odświeżeniu), teraz z jakiegoś powodu miga każdym znacznikiem. Pójdę wypróbować inną metodę. –