data-binding binding - ¿Cómo vincular múltiples valores a un solo WPF TextBlock?




textbox two (5)

Use un 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;
    }
}

y en el marcado

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

. . .

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

Actualmente estoy usando el TextBlock continuación para vincular el valor de una propiedad llamada Name :

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

Ahora, quiero vincular otra propiedad llamada ID con el mismo TextBlock .

¿Es posible vincular dos o más valores al mismo TextBlock ? ¿Se puede hacer con una concatenación simple, como Name + ID y, de no ser así, de qué otra manera podría abordarse?


Si estos solo van a ser bloques de texto (y por lo tanto unidireccionales), y solo desea concatenar valores, solo una dos bloques de texto y colóquelos en un panel de distribución horizontal.

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

Eso mostrará el texto (que es todo lo que hace Textblocks) sin tener que hacer ninguna codificación adicional. Puede ponerles un pequeño margen para que se vean bien.


Sé que esta es una forma tarde, pero pensé que agregaría otra forma de hacerlo.

Puede aprovechar el hecho de que la propiedad Text se puede configurar con " Run s", por lo que puede configurar enlaces múltiples usando una Ejecución para cada uno. Esto es útil si no tiene acceso a MultiBinding (que no encontré cuando desarrollé para Windows Phone)

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

Puede usar un MultiBinding combinado con la propiedad StringFormat . El uso sería similar al siguiente:

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

Dado un valor de Name of Foo y un valor para ID de 1 , la salida en TextBlock sería Foo + 1 .

Note: esto solo es compatible con .NET 3.5 SP1 y 3.0 SP2 o posterior.


Algunos bits y piezas útiles:

Aquí está cómo hacerlo principalmente en código:

Binding b = new Binding();
b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, this.GetType(), 1);
b.Path = new PropertyPath("MyElementThatNeedsBinding");
MyLabel.SetBinding(ContentProperty, b);

En gran parte copié esto de Binding Relative Source en el código Detrás .

Además, la página de MSDN es bastante buena en cuanto a los ejemplos: RelativeSource Class





wpf data-binding binding textblock multibinding