我有以下代码来显示客户年龄。
<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" />
然而,我不是只显示数字,而是在文本“Age”前面添加前缀,并在文本“yrs”后面加上它,因此它实际上变成了“年龄36岁”
我可以使用水平StackPanel和3个文本框来实现这个目标,但是我有一个更简单的方法吗?
答案 0 :(得分:8)
假设您不需要年龄值可编辑,在WPF 4.0中,Run的Text属性将是可绑定的,除非您使用预发布版本,否则这可能对您没有帮助,但您将能够做类似以下的事情:
<TextBlock x:Name="txtClientAge" >
<Run Text="Age "/><Run Text="{Binding Path=ClientAge}"/><Run Text=" Yrs"/>
</TextBlock>
更新下一个替代格式字符串解决方案,它将起作用但不是特别漂亮(事实上它非常hacky)。在绑定上使用以下转换器(假设ClientAge属性的类型为int):
public class AgeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
string age = value.ToString();
return "Age " + age + " years";
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
string age = value as string;
return Int32.Parse(age.Replace("Age ", " ").Replace(" years", ""));
}
}
答案 1 :(得分:5)
您也可以在要绑定的类中创建一个属性,以创建您想要显示的文本字符串。
还有StringFormat路线:
<textblock text="{Binding Path=mydate, StringFormat=d}"/>
您可以将常量破解为格式化字符串。
我更喜欢属性方法。
答案 2 :(得分:5)
这是一个很老的问题,但我认为这是目前最好的解决方案(如果你想编辑文本)。
您可以使用嵌套InlineUIContainer
TextBlock
中的Textbox
来完成此操作。
注意:我使用BaselineAlignment="Center"
来对齐组件。您还可以根据需要向TextBox
添加正边距或负边距。另外,我将TextBox
的边框设置为透明,使其看起来像TextBlock
的一部分,即使它是可编辑和可选择的。
<TextBlock Foreground="SteelBlue">
<Run Text="Package Barcode:" FontWeight="Bold" BaselineAlignment="Center"/>
<InlineUIContainer BaselineAlignment="Center">
<TextBox Margin="2,0,0,0" Foreground="Gray" Text="{Binding BarcodeNumber}" BorderThickness="0" Padding="0"/>
</InlineUIContainer>
</TextBlock>
答案 3 :(得分:1)
这就像之前的回答 - (但他们都是使用Texblocks ...所以这里是Textbox版本),我也想展示Multibinding方法。要让Texbox执行您想要的操作,您可以使用以下代码:
<TextBox>
<TextBox.Text>
<MultiBinding StringFormat="Age {0} yrs and {1} months">
<Binding Path="Years" />
<Binding Path="Months" />
</MultiBinding>
</TextBox.Text>
</TextBox>
如果您想让文本可选,以便用户可以复制代码,这可能很有用。