Caliburn.Micro将十六进制值视为错误输入

本文关键字:错误 输入 Micro 十六进制 Caliburn | 更新日期: 2023-09-27 18:27:55

我在C#WPF MVVM应用程序中使用Caliburn.Micro。我的应用程序中有TextBox:

<TextBox Name="Param1" Grid.Row="1" Grid.Column="0"/>

和ViewModel:中的Param1属性

public Byte Param1
{
    get { return this._param1; }
    set
    {
        this._param1 = value;
        NotifyOfPropertyChange(() => this.Param1);
    }
}

但是,当我尝试在这个文本框中输入8位十六进制值(例如1F、C0、2A)时,textbox的边框会被涂成红色。可能是Caliburn。Micro将十六进制值视为错误输入,因为十进制的8位值(例如:101、97、64)被视为正确输入。如何使Caliburn.Micro将十六进制值视为正确的输入?在我的情况下,我该怎么做?我们将非常感谢你的帮助。

Caliburn.Micro将十六进制值视为错误输入

Caliburn Micro默认不提供十六进制转换器。您必须编写自己的转换器。类似于:
[ValueConversion(typeof(byte), typeof(string))]
public class HexConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        byte byteValue = (byte)value;
        return byteValue.ToString("X", culture);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        byte byteValue;
        string stringValue = (string)value;
        if (String.IsNullOrEmpty(stringValue))
        {
            return 0;
        }
        if (Byte.TryParse(stringValue, NumberStyles.AllowHexSpecifier, culture, out byteValue))
        {
            return byteValue;
        }
        return DependencyProperty.UnsetValue;
    }
}

现在您有两个选项:

  1. Param1文本框定义特定绑定;在该绑定中,您可以使用HexConverter
  2. 另一方面,如果您需要在整个应用程序中使用该转换器,则可以以正确的方式配置ConventionManager

第一个解决方案非常简单,所以我只展示第二个。我们必须对Caliburn说,每当我们有一个命名的TextBox控件"链接"到byte属性时,我们都希望使用HexConverter

所以我们可以在Bootstrapper:中进行

public class Bootstrapper : BootstrapperBase
{
    private static IValueConverter hexConverter = new HexConverter();
    public Bootstrapper()
    {
        Initialize();
    }
    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        /* Show your starting view model */
        DisplayRootViewFor<MainViewModel>();
    }
    protected override void Configure()
    {
        ConventionManager.ApplyValueConverter = (binding, dependencyProperty, propertyInfo) =>
            {
                if (dependencyProperty == UIElement.VisibilityProperty && typeof(bool).IsAssignableFrom(propertyInfo.PropertyType))
                {
                    binding.Converter = ConventionManager.BooleanToVisibilityConverter;
                    return;
                }
                if (dependencyProperty == TextBox.TextProperty && typeof(byte).IsAssignableFrom(propertyInfo.PropertyType))
                {
                    binding.Converter = hexConverter;
                    return;
                }
            };
    }
}

如您所见,我使用匿名方法设置了ApplyValueConverter操作,如果绑定的依赖项属性是VisibilityProperty,而源属性是bool(这是Caliburn默认值),则该方法使用BooleanToVisibilityConverter

此外,如果Caliburn将Text依赖属性绑定到byte,那么它将使用我们的HexConverter。

我希望它能帮助你。