在我们的 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}\nRun Code Online (Sandbox Code Playgroud)\n
这个怎么样:查看:
<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)
| 归档时间: |
|
| 查看次数: |
1868 次 |
| 最近记录: |