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将十六进制值视为正确的输入?在我的情况下,我该怎么做?我们将非常感谢你的帮助。
[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
文本框定义特定绑定;在该绑定中,您可以使用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;
}
};
}
}
如您所见,我使用匿名方法设置了ApplyValueConverter
操作,如果绑定的依赖项属性是VisibilityProperty
,而源属性是bool
(这是Caliburn默认值),则该方法使用BooleanToVisibilityConverter
。
此外,如果Caliburn将Text
依赖属性绑定到byte
,那么它将使用我们的HexConverter。
我希望它能帮助你。