WPF在TextBox中混合绑定和固定文本

时间:2009-09-15 21:46:44

标签: .net wpf text binding textbox

我有以下代码来显示客户年龄。

<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" />

然而,我不是只显示数字,而是在文本“Age”前面添加前缀,并在文本“yrs”后面加上它,因此它实际上变成了“年龄36岁”

我可以使用水平StackPanel和3个文本框来实现这个目标,但是我有一个更简单的方法吗?

4 个答案:

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

如果您想让文本可选,以便用户可以复制代码,这可能很有用。