编辑模式下不同的文本框格式

Igo*_*vas 1 wpf textbox

在我们的 WPF 项目中,我们使用文本框让用户输入一些长度测量值。该测量单位可以是毫米、厘米、英寸等(取决于用户配置)。

\n\n

我们需要在文本框中显示数字以及当前的测量单位,例如:\n“120 mm”\n“16 cm”\n“1\' 2 3/4”\n等等。

\n\n

我正在使用 ValueConverter 执行单位转换并添加额外的格式。UpdateSourceTrigger 是默认值,因此当用户离开控件时将应用绑定。

\n\n

这里的挑战是,在编辑值时,这些“mm”或“cm”不会显示。因此,编辑模式下的先前示例将是:\n"120"\n"16"\n"1 2 3/4"

\n\n

我怎样才能做到这一点?

\n\n

以下是一些 cen\xc3\xa1rios 的转换器代码:

\n\n
/// <summary>\n/// Converts and formats the value (in milimeters) to the required unit/format\n/// </summary>\npublic class LengthConverter : IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        LengthUnit unit = MainWindow.CurrentLengthUnit;\n\n        switch (unit.Id)\n        {\n            case 1: //Milimeters\n                return value + " mm";\n            case 2: //Centimeters\n                return (double)value / 10.0 + " cm";\n            default:\n                throw new InvalidOperationException("Unknown length unit.");\n\n        }\n\n    }\n\n    public object ConvertBack(object value, Type targetType,\n           object parameter, CultureInfo culture)\n    {\n        string rawValue = value as string;\n\n        LengthUnit unit = MainWindow.CurrentLengthUnit;\n\n        switch (unit.Id)\n        {\n            case 1: //Milimeters\n                return rawValue.Replace("mm", "").Trim();\n            case 2: //Centimeters\n                return Double.Parse(rawValue.Replace("cm", "").Trim()) * 10.0;\n            default:\n                throw new InvalidOperationException("Unknown length unit.");\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ank*_*nka 5

这个怎么样:查看:

<TextBox>
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Style.Triggers>
                        <Trigger Property="IsFocused" Value="False">
                            <Setter Property="Text">
                                <Setter.Value>
                                    <MultiBinding Converter="{StaticResource LengthConverter}">
                                        <Binding Path="Foo"/>
                                        <Binding Path="Text" RelativeSource="{RelativeSource Mode=Self}"/>
                                    </MultiBinding>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter Property="Text" Value="{Binding Foo}"></Setter>
                        </Trigger>
                    </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
Run Code Online (Sandbox Code Playgroud)

转换器:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    if (values.Count() > 1)
    {
      var value = values[1].ToString();
      if (value != String.Empty)
      {
        int output;
        Int32.TryParse(value, out output);
        if (output != (int)values[0])
          return value;
      }
    }
    return String.Format("{0} {1}", values[0], "mm");      
}
Run Code Online (Sandbox Code Playgroud)