【问题标题】:Caliburn.Micro treats hexadecimal values as wrong inputCaliburn.Micro 将十六进制值视为错误输入
【发布时间】:2015-12-24 13:58:01
【问题描述】:

我在我的 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)时,文本框的边框会变为红色。可能 Caliburn.Micro 将十六进制值视为错误输入,因为十进制 8 位值(例如:101、97、64)被视为正确输入。如何使 Caliburn.Micro 将十六进制值视为正确输入?在我的情况下我该怎么做?我们将非常感谢您的帮助。

【问题讨论】:

  • 一方面,与 Caliburn 无关,因为常规 WPF 应用程序中的 TextBox 做同样的事情。
  • 一个字节是0-255之间的小数,所以自然不能把“1F”转换成数字,因为它不是一个有效的数字。您需要一个 ValueConverter 来完成从文本(输入)到十进制(字节、输出)的转换

标签: c# wpf mvvm caliburn.micro


【解决方案1】:

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 TextBox 定义一个特定的绑定;在该绑定中,您可以使用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;
                }
            };
    }
}

如您所见,我使用 anonymous 方法设置了 ApplyValueConverter 操作,如果绑定的依赖属性是 VisibilityProperty 而源属性是 @ 987654333@(这是 Caliburn 的默认值)。

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

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2014-02-05
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多