WPF: Frage zu Textformatierung

14/08/2008 - 13:07 von Dirk3 | Report spam
Hallo,

ich habe folgendes xaml-File:

<UserControl x:Class="WpfBindingTest.UserControl2"
xmlns="http://schemas.microsoft.com/winfx/...tion"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:MyDataSource="clr-namespace:WpfBindingTest"
Height="300" Width="300">
<UserControl.Resources>
</UserControl.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock>
<Run>Person: </Run>
<TextBlock FontWeight="Bold" Text="{Binding
LastName}" />
<Run>, </Run>
<TextBlock Text="{Binding FirstName}" />
<Run> </Run>
<TextBlock Text="{Binding MiddleInitial}" />
</TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</UserControl>

Die Ausgabe: Person: a, b c ... wie erwartet.
Ich àndere das xaml-File wie folgt ab: (unwichtiges entfernt)

<UserControl.Resources>
<local:FullNameConverter x:Key="NameConverter" />
</UserControl.Resources>
.
.
.
<StackPanel Orientation="Horizontal">
<TextBlock>
<Run>Person: </Run>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource
NameConverter}" ConverterParameter="LastNameFirst" >
<Binding Path="FirstName" />
<Binding Path="LastName" />
<Binding Path="MiddleInitial" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>


Der NameConverter entspricht grundsàtzlich dem aus der MSDN.

Bei der Ausgabe fehlt der führende String "Person: ".
D.h. die Ausgabe sieht etwa so aus:
a, b c ...erwartet hàtte ich Person: a, b c

Was habe ich übersehen?

MfG
Dirk
 

Lesen sie die antworten

#1 André Pönisch
15/08/2008 - 00:47 | Warnen spam
Dirk3 schrieb:
Hallo Dirk,

<TextBlock>
<Run>Person: </Run>
<TextBlock.Text>
<MultiBinding ... >
<Binding Path="FirstName" />
<Binding Path="LastName" />
<Binding Path="MiddleInitial" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>



Das Problem ist, das ein TextBlock nur einen Content haben kann. Dieser
Content wird durch das Attribut Text (das du hier mit <TextBlock.Text>
füllst) direkt gesetzt oder wird automatisch aus dem Inhalt des Tags
genommen (also alles zwischen <TextBlock> und </TextBlock>, was nicht
<TextBlock.xyz> ist).

Du deklarierst hier also quasi zwei Inhalte. Einmal "<Run>Person: </Run>"
und einmal mit dem Multibinding. Und die direkte Angabe per benannten Tag
hat Vorrang, weswegen das Multibinding gewinnt und "Person:" unter den
Tisch fàllt.

Ums kurz zu machen, versuchs z.B. mal so:

<TextBlock>
<Run>Person: </Run>
<TextBlock>
<TextBlock.Text>
<MultiBinding ... >
<Binding Path="FirstName" />
<Binding Path="LastName" />
<Binding Path="MiddleInitial" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</TextBlock>

Grüße
André

Ähnliche fragen