WPF:DataGrid显示所有DataGridTemplateColumns的验证错误

时间:2017-09-11 17:50:12

标签: c# wpf validation datagrid

我有一个简单的标准WPF 4 DataGrid,有两列。

backgrop

显示的数据对象定义如下:

<DataGrid ItemsSource="{Binding Source={StaticResource ItemDataView}}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Alpha">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Alpha}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Beta">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Beta}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

即。 Alpha必须具有非空值,但Beta可以为空。

如果我添加一个MyObject,其中Alpha值为空,那么两者 Alpha和Beta单元格都会显示一个红色边框,表示验证错误。这仅适用于DataGridTemplateColumns;我尝试过添加DataGridTextColumn,但它没有获得红色边框。如果未绑定任何内容,Beta列也会获得红色边框,或者即使它没有附加控件(例如DataTemplate为空)。

a)为什么会这样?

b)我怎样才能阻止它发生?我只希望单元格上的红色验证边框有错误。

1 个答案:

答案 0 :(得分:1)

INotifyDataErrorInfo用于确定是否存在错误。具体而言,必须实现HasErrors属性才能返回true或false以表示是否存在错误。在您的情况下,HasErrors实施仅查看Alpha

public bool HasErrors
{
    get { return string.IsNullOrEmpty(Alpha); }
}

因此,只有当Alpha为空或空时才会显示错误。

你需要修改它来检查两者,如下所示:

public bool HasErrors
{
    get 
    {
       return !AlphaIsValid || !BetaIsValid;
    }
}

private bool AlphaIsValid
{
    get {return !string.IsNullOrEmpty(Alpha);}
}

private bool BetaIsValid
{
    get {return Beta == null || Beta != "";}
}

然后,在GetErrors()中,检查传入的字符串以查看它是否与AlphaBeta匹配,并为每个字符串提供错误消息,如下所示:

public IEnumerable GetErrors(string propertyName)
{
    if (propertyName == nameof(Alpha) && !AlphaIsValid)
    {
        return new []{"Alpha is null or empty"};
    }
    if (propertyName == nameof(Beta)  && !BetaIsValid)
    {
        return new []{"Beta is empty"};
    }
    return Enumerable.Empty<string>();
}

如果属性没有错误,则返回空集合。

目前,您要为两个属性返回一个值(因为您只是返回属性名称),因此两者都被标记为有验证错误。

供参考:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo(v=vs.110).aspx