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;
}
}
现在你有两个选择:
- 为
Param1 TextBox 定义一个特定的绑定;在该绑定中,您可以使用HexConverter;
- 另一方面,如果您需要在整个应用程序中使用该转换器,您可以以正确的方式配置
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。
希望对你有所帮助。