.net - varias - que es concatenar en programacion
Concatenar cadenas en lugar de usar una pila de TextBlocks (4)
Quiero mostrar una lista de objetos del Cliente en un WPF ItemsControl. Creé un DataTemplate para esto:
<DataTemplate DataType="{x:Type myNameSpace:Customer}">
<StackPanel Orientation="Horizontal" Margin="10">
<CheckBox"></CheckBox>
<TextBlock Text="{Binding Path=Number}"></TextBlock>
<TextBlock Text=" - "></TextBlock>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</StackPanel>
</DataTemplate>
Entonces, básicamente lo que quiero es una lista simple (con casillas de verificación) que contenga NUMBER - NAME. ¿No hay una manera en que pueda concaturar el número y el nombre directamente en la parte vinculante?
En caso de que quiera concat un valor dinámico con un texto estático, intente esto:
<TextBlock Text="{Binding IndividualSSN, StringFormat= ''/{0/} (SSN)''}"/>
Muestra : 234-334-5566 (SSN)
Existe la propiedad StringFormat (en .NET 3.5 SP1), que probablemente pueda usar. Y útil WPF binding cheat sheat puede encontrar here . Si no ayuda, siempre puede escribir su propio ValueConverter o propiedad personalizada para su objeto.
Acabo de marcar, puede usar StringFormat con multibinding. En tu caso, el código será algo como esto:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat=" {0} - {1}">
<Binding Path="Number"/>
<Binding Path="Name"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Tuve que iniciar la cadena de formato con espacio; de lo contrario, Visual Studio no se compilaría, pero creo que encontrarás la forma de evitarlo :)
Editar
El espacio se necesita en StringFormat para evitar que el analizador trate {0}
como un enlace real. Otras alternativas
<!-- use a space before the first format -->
<MultiBinding StringFormat=" {0} - {1}">
<!-- escape the formats -->
<MultiBinding StringFormat="/{0/} - /{1/}">
<!-- use {} before the first format -->
<MultiBinding StringFormat="{}{0} - {1}">
También puede usar una ejecución enlazable. Cosas útiles, especialmente si uno quiere agregar algún formato de texto (colores, fontweight, etc.).
<TextBlock>
<something:BindableRun BoundText="{Binding Number}"/>
<Run Text=" - "/>
<something:BindableRun BoundText="{Binding Name}"/>
</TextBlock>
Here''s una clase original:
Here hay algunas mejoras adicionales.
Y eso es todo en una sola pieza de código:
public class BindableRun : Run
{
public static readonly DependencyProperty BoundTextProperty = DependencyProperty.Register("BoundText", typeof(string), typeof(BindableRun), new PropertyMetadata(new PropertyChangedCallback(BindableRun.onBoundTextChanged)));
private static void onBoundTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((Run)d).Text = (string)e.NewValue;
}
public String BoundText
{
get { return (string)GetValue(BoundTextProperty); }
set { SetValue(BoundTextProperty, value); }
}
public BindableRun()
: base()
{
Binding b = new Binding("DataContext");
b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(FrameworkElement), 1);
this.SetBinding(DataContextProperty, b);
}
}
Vea el siguiente ejemplo que utilicé en mi código usando la clase Run:
<TextBlock x:Name="..." Width="..." Height="..."
<Run Text="Area="/>
<Run Text="{Binding ...}"/>
<Run Text="sq.mm"/>
<LineBreak/>
<Run Text="Min Diameter="/>
<Run Text="{Binding...}"/>
<LineBreak/>
<Run Text="Max Diameter="/>
<Run Text="{Binding...}"/>
</TextBlock >