Tek bir WPF TextBlock'a birden çok değer nasıl bağlanır?


210

Şu anda TextBlockadlı bir özellik değerini bağlamak için aşağıdaki kullanıyorum Name:

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

Şimdi, aynı adlı başka bir özelliği bağlamak istiyorum .IDTextBlock

İki veya daha fazla değeri aynı şekilde bağlamak mümkün müdür TextBlock? Basit birleştirme ile yapılabilir mi Name + ID, eğer değilse, başka nasıl ele alınabilir?

Yanıtlar:


434

Özellikle MultiBindingbirlikte kullanabilirsiniz StringFormat. Kullanım aşağıdakine benzer:

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

Verme Namedeğerini Foove IDdeğeri 1, TextBlock içinde çıktı sonra olurdu Foo + 1.

Note: bunun yalnızca .NET 3.5 SP1 ve 3.0 SP2 veya sonraki sürümlerinde desteklendiğini unutmayın.


5
@Preet - Bu durumda '{}' gerekli olup olmadığından emin değilim, MSDN örneğinde kullanıldığı için dahil ettim. Bununla birlikte, genel olarak, XAML ayrıştırıcısının Bağlama işaretleme uzantısı ile karışıklığı önlemek için bir kaçış dizisi olarak gereklidir.
Richard McGuire

2
Bunun bir yan etkisi vardır. Bu yöntemi bir DataGridsıralama davranışı gibi bir şey kullanırsanız maalesef çalışmaz. Daha uygun bir çözüm, modelinizde bağlanacak uygun dize biçimiyle salt okunur bir özellik oluşturmak olabilir. Söylemeye gerek yok, bu biraz ayrıntılı da olsa hızlı bir şekilde biçimlendirmenin düzgün bir yoludur.
Brett Ryan

34
biçim dizesi {0} parametresiyle başladığında {} gerekir, biçim dizesi bir metinle başlıyorsa buna gerek yoktur. örnek: "{} {0} + {1}" "Sayfa {0} / {1}"
Dakianth

Bu 4,0 Visual Studio 2017 WPF projesi Net işe yaramadı
Sorush

@ Patrick'in çözümü benim için çalıştı. Bunu çalıştıramadım. Bu hatayı aldımXamlParseException: A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
Tyson Williams

127

Bunun çok geç olduğunu biliyorum, ama bunu yapmanın bir yolunu daha ekleyeceğimi düşündüm.

Text özelliğinin " Run s" kullanılarak ayarlanabilmesinden yararlanabilirsiniz , böylece her biri için bir Run kullanarak birden çok ciltleme ayarlayabilirsiniz. MultiBinding'a (Windows Phone için geliştirirken bulamadım) erişiminiz yoksa bu yararlıdır

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

4
Bu, DynamicForource olarak kaynaklanan birkaç dizeye bağlanırken kullanmak için çok kullanışlı bir yaklaşımdır, çünkü bunun için StringFormat ile bir MultiBinding kullanamazsınız.
slugster

Sadece denedim. Çalışır, ancak çizilen her eleman (hatta geometri) (bir yenilemede) şimdi bir sebepten dolayı her bir kene yanıp söner. Diğer yöntemi deneyecek.
Logan Klenner

6
Sipariş sabit kodlanmış olduğu için metnin yerelleştirilmesi gerekiyorsa bu zorlaşabilir.
BlueM

1
Bu yaklaşımın bir başka kullanımı da her ciltleme için farklı bir stil uygulamaktır
Hamid Naeemi


23

Bunlar yalnızca metin blokları olacaksa (ve böylece tek yönlü ciltleme olacak) ve değerleri birleştirmek istiyorsanız, iki metin bloğunu bağlayın ve yatay bir yığın paneline koyun.

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

Bu, metni (tüm Textblocks'ın yaptığı) daha fazla kodlama yapmadan görüntüleyecektir. Doğru görünmelerini sağlamak için üzerlerine küçük bir kenar boşluğu koyabilirsiniz.


11

ValueConverter kullanın

[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;
    }
}

ve işaretlemede

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

. . .

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

Evet - bu 6 yıl önce yazılmıştır ve dönüştürücüye ilk kod olarak "Ad" ı (kodda değer olarak adlandırılır) ve ikinci argüman olarak kimliği (sorudan bir dize) bağlarsınız.
Preet Sangha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.