我有一个简单的标准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)我怎样才能阻止它发生?我只希望单元格上的红色验证边框有错误。
答案 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()
中,检查传入的字符串以查看它是否与Alpha
或Beta
匹配,并为每个字符串提供错误消息,如下所示:
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