80 votes

Concaténer des chaînes au lieu d'utiliser une pile de TextBlocks

Je souhaite afficher une liste d'objets Client dans un élément WPF ItemsControl. J'ai créé un DataTemplate pour cela:

     <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>
 

Donc, ce que je veux fondamentalement, c'est une simple liste (avec des cases à cocher) qui contient NUMBER - NAME. Est-ce qu'il n'y a pas moyen de concaténer le numéro et le nom directement dans la partie Binding?

159voto

PiRX Points 1986

Il est StringFormat propriété dans .NET 3.5 SP1), vous pouvez probablement utiliser. Et WPF utile de liaison aide mémoire peuvent être trouvées ici. Si cela n'aide pas, vous pouvez toujours écrire votre propre ValueConverter ou de la propriété personnalisée pour votre objet.

Viens de vérifier, vous pouvez utiliser StringFormat avec multibinding. Dans votre cas, le code ressemblera à ceci:

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

J'ai dû commencer chaîne de format avec de l'espace, sinon, Visual Studio ne se construit pas, mais je pense que vous trouverez le moyen de contourner ça :)

Modifier
L'espace est nécessaire dans le StringFormat de garder l'analyseur de traitement de l' {0} comme une réelle liaison. D'autres alternatives:

<!-- 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}">

60voto

redskull Points 56

Si vous voulez concaténer une valeur dynamique avec un texte statique, essayez ceci:

 <TextBlock Text="{Binding IndividualSSN, StringFormat= '\{0\} (SSN)'}"  Style="{StaticResource TextBlockLeftStyle}" />
 

Affichages : 234-334-5566 (SSN)

8voto

user3262530 Points 1

Voir l'exemple suivant que j'ai utilisé dans mon code à l'aide de la classe 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 >
 

3voto

cz_dl Points 420

Vous pouvez également utiliser une exécution pouvant être liée. Choses utiles, surtout si vous voulez ajouter du formatage de texte (couleurs, épaisseur de police, etc.).

 <TextBlock>
   <something:BindableRun BoundText="{Binding Number}"/>
   <Run Text=" - "/>
   <something:BindableRun BoundText="{Binding Name}"/>
</TextBlock>
 

Voici une classe originale:
Voici quelques améliorations supplémentaires.
Et c'est tout dans un morceau de code:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X