在 Avalonia 的 DataGrid 中绑定或验证失败后隐藏或编辑异常

问题描述 投票:0回答:1
c# avalonia
1个回答
0
投票

我很不确定这是否是正确的解决方案,但到目前为止我发现实现我想要的唯一有效方法是用一种“包装器”来包装

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
中的类型),它总是被接受,并且我自己处理该转换(及其错误)。

它看起来很糟糕,并且添加了很多额外的代码,可能存在其他一些问题,但它似乎对我有用,所有额外的问题希望都是我现在的问题,而不是框架的问题(这意味着我不必等待框架开发人员)为我解决它们)

© www.soinside.com 2019 - 2024. All rights reserved.