我很不确定这是否是正确的解决方案,但到目前为止我发现实现我想要的唯一有效方法是用一种“包装器”来包装
SomeModel
,它的所有属性都键入为string
.
类似这样的:
public class SomeModel(decimal someNum = 10.0m)
{
public decimal SomeValue = someNum;
}
public class SomeModelWrapper(SomeModel data) : ObservableObject, INotifyDataErrorInfo {
private SomeModel rawData = data;
private string someValue = data.SomeValue.ToString();
public string SomeValue { get => someValue; set
{
if (SetProperty(ref someValue, value))
{
// exctractValueFromString adds "nice" validation error
// if value cannot be converted.
var convertedValue = extractValueFromString(value);
if (convertedValue != null)
{
// Handle validation here
...
// Update underlying data
SetProperty(ref rawData.SomeValue, convertedValue, nameof(SomeValue));
}
}
}
// Implement INotifyDataErrorInfo
...
}
extractValueFromString
方法接受我们需要转换的字符串值,并尝试将其解析为所需的类型。如果失败,它将返回 null 并为此属性添加验证错误。
现在,我不再将 DataGrid 绑定到
SomeModel
中的实际数据,而是将其绑定到该“包装器”。这样,每当 DataGrid 中的值发生变化时,无论它是否可以转换为目标类型(SomeModel
中的类型),它总是被接受,并且我自己处理该转换(及其错误)。
它看起来很糟糕,并且添加了很多额外的代码,可能存在其他一些问题,但它似乎对我有用,所有额外的问题希望都是我现在的问题,而不是框架的问题(这意味着我不必等待框架开发人员)为我解决它们)