76 lines
2.6 KiB
C#
76 lines
2.6 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Data;
|
||
|
||
namespace BDU.Converters
|
||
{
|
||
public class HexToDecimalConverter : IValueConverter
|
||
{
|
||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||
{
|
||
|
||
// 将模型中的十进制值转换为十六进制字符串显示
|
||
if (value != null)
|
||
{
|
||
if (value.GetType() == typeof(int) && value is int intValue)
|
||
{
|
||
return $"0x{intValue:X}";
|
||
}
|
||
}
|
||
return value!;
|
||
}
|
||
|
||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||
{
|
||
// 将用户输入的十六进制字符串(如 "0x13A")转换回十进制整数
|
||
if (value is string stringValue && !string.IsNullOrEmpty(stringValue))
|
||
{
|
||
// 移除可能存在的空格
|
||
stringValue = stringValue.Trim();
|
||
|
||
// 检查是否以 "0x" 或 "0X" 开头
|
||
if (stringValue.StartsWith("0x", StringComparison.OrdinalIgnoreCase)&& stringValue.Length>2)
|
||
{
|
||
try
|
||
{
|
||
// 移除 "0x" 前缀,然后解析为整数
|
||
var hexString = stringValue.Substring(2);
|
||
return System.Convert.ToInt32(hexString, 16);
|
||
}
|
||
catch (FormatException)
|
||
{
|
||
// 如果格式错误,返回 null 或者抛出异常,取决于您的需求
|
||
// 这里我们返回 null,让绑定系统保持原值或触发验证
|
||
return Binding.DoNothing;
|
||
}
|
||
catch (OverflowException)
|
||
{
|
||
return Binding.DoNothing;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 如果没有 "0x" 前缀,则尝试按十进制解析
|
||
try
|
||
{
|
||
return System.Convert.ToInt32(stringValue);
|
||
}
|
||
catch (FormatException)
|
||
{
|
||
return Binding.DoNothing;
|
||
}
|
||
catch (OverflowException)
|
||
{
|
||
return Binding.DoNothing;
|
||
}
|
||
}
|
||
}
|
||
return Binding.DoNothing;
|
||
}
|
||
}
|
||
}
|