1

我有一个 DataGrid,它的 Column 绑定了一个“int”类型的属性。我正在使用 IDataErrorInfo 进行验证。我的验证规则运行良好,一旦我更改单元格的值,它们就会被触发。假设用户输入的值小于 0,我在工具提示中显示相应的错误。当用户清除文本框的值时出现问题。在这种情况下,IDataErrorInfo 永远不会触发,因此我无法通过工具提示显示用户验证错误,说明该值不能为空。DataGrid 在文本框周围加上红色边框,这很好,还有一个“!” 在行标题处签名,但工具提示中没有验证错误,因为 IDataErrorInfo 从未被触发。如果文本框的值被清除,我可以做些什么来触发 IDataError 信息?

编辑:
XAML

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayOrder, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding DisplayOrder, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

DisplayOrder 属性

public int DisplayOrder
{
    get
    {
        return m_DisplayOrder;
    }
    set
    {
        if(value != m_DisplayOrder)
        {
            m_DisplayOrder = value;
            OnPropertyChanged("DisplayOrder");
        }
    }
}
4

2 回答 2

2

您应该发布您的绑定并向我们展示您的 itemssource 对象。我假设您绑定的属性是 int 类型,因此如果您清除文本框,wpf 绑定会尝试将 int 属性设置为 null。发生绑定错误导致您的 int 不可为空。并且由于绑定错误,您的 idataerror 没有机会触发,因为它不会被调用。您可以尝试将 ValidatesOnExceptions=true 添加到您的数据网格列绑定以查看错误。

于 2011-04-08T08:21:21.453 回答
0

正如您从错误中看到的那样,StringToNumber 转换正在抛出,您可以尝试使用自己的 IValueConverter 将 String 转换为 Int 或其他方式。也许默认情况下它会将空字符串转换为 0(您的 IDataErrorInfo 应该启动并显示错误)

于 2011-04-08T13:24:38.253 回答