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

Mit*_*tch 7 .net wpf binding text textbox

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

<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" />
Run Code Online (Sandbox Code Playgroud)

然而,我不是只显示数字,而是用文本"Age"作为前缀,并以文本"yrs"为后缀,因此它实际上变为"年龄36岁"

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

Sim*_*Fox 8

假设您不需要年龄值可编辑,在WPF 4.0中,Run的Text属性将是可绑定的,这可能对您现在没有帮助,除非您使用预发布但是您将能够执行某些操作如下:

<TextBlock x:Name="txtClientAge" >
    <Run Text="Age "/><Run Text="{Binding Path=ClientAge}"/><Run Text=" Yrs"/>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

UPDATE Heres是格式字符串解决方案的另一种替代方案,它可以工作但不是特别漂亮(事实上它非常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", ""));
    }
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 5

您可以在绑定的类中创建一个属性,以创建您想要显示的文本字符串.

还有StringFormat路线:

<textblock text="{Binding Path=mydate, StringFormat=d}"/>
Run Code Online (Sandbox Code Playgroud)

您可以将常量破解为格式化字符串.

我更喜欢属性方法.

  • 这实质上是将您的模型修改为视图感知 - 从设计角度来看这是一个非常糟糕的主意. (3认同)
  • 如果你真的想要这样做,那么文本也不属于视图.它需要位于表示层根据您当前的文化设置选择的资源区域中.这就是为什么我的所有东西都来自演示者属性. (2认同)

Sim*_*ver 5

这是一个很老的问题,但我认为这是目前最好的解决方案(如果你想编辑文本).

您可以使用嵌套InlineUIContainer中的a 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>
Run Code Online (Sandbox Code Playgroud)