C# 文本框中的StringFormat有意义吗?

C# 文本框中的StringFormat有意义吗?,c#,xaml,C#,Xaml,如果我有这样一个文本框: <TextBox Text="{Binding Voltage, StringFormat={}{0} kV}" /> <my:TextBox Text="{Binding Voltage}" Description="kV" /> 我认为我的程序的用户不会接受这一点 那么,我是做错了什么,还是这项功能无法以合理的方式使用文本框?我建议使用转换器: <TextBox Text="{Binding Voltage, Converter={

如果我有这样一个文本框:

<TextBox Text="{Binding Voltage, StringFormat={}{0} kV}" />
<my:TextBox Text="{Binding Voltage}" Description="kV" />
我认为我的程序的用户不会接受这一点


那么,我是做错了什么,还是这项功能无法以合理的方式使用文本框?

我建议使用转换器:

<TextBox Text="{Binding Voltage, Converter={StaticResource VoltageToString}}" />

这只是一个基本示例,但您应该了解如何使其更复杂。

StringFormat
Binding
标记扩展的属性,理论上可以用于任何绑定。然而,大多数情况下,它只适用于单向绑定

您是对的,stringformat在TextBox中没有多大意义

您可以按照David的建议通过转换器解决此问题,但我建议您在TextBox外的TextBlock中显示该单元:

<DockPanel>
   <TextBlock Text="kV" DockPanel.Dock="Right />
   <TextBox Text="{Binding Voltage}" />
</DockPanel>


我的WPF/xaml知识还不足以直接回答这个问题,但我已经看到通过将
Voltage
定义为它自己的类型,然后定义一个可以来回转换为字符串格式的格式化程序来实现这一点。这非常简洁,允许用户输入
40kV
400V
1mV
等。我通常喜欢将前缀/后缀保留在文本框之外。虽然我确实喜欢@jamice的选项,因为它允许用户输入自己的选项。我也喜欢jamice的选项,但要注意额外的成本:大多数情况下,您的模型将具有基本类型(int或double)的属性,您需要在viewmodel中将其转换为自定义类型,反之亦然。
public class VoltageToString: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)
    {
        return ((int)value).ToString() + " kV";
    }

    public object ConvertBack(object value, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)
    {
        return int.Parse((string).Replace(" kV",""));
    }
}
<DockPanel>
   <TextBlock Text="kV" DockPanel.Dock="Right />
   <TextBox Text="{Binding Voltage}" />
</DockPanel>
<my:TextBox Text="{Binding Voltage}" Description="kV" />