我正在尝试更新我的 ViewModel 以使用 INotifyDataErrorInfo 而不是 IDataErrorInfo 并且遇到以下问题:
当前编辑字段的验证似乎可以正常工作,但直到我结束对出现错误的字段进行编辑,然后开始重新编辑它时,才会出现行级错误指示器。之后,错误指示器消失,修复验证错误后的事件。
换句话说:我第一次编辑行时,TextBox 轮廓正确地变为红色,但行指示器没有出现。重新编辑行会导致行指示器出现。修复验证错误会导致字段轮廓消失,但会留下感叹号。
请注意, IDataErrorInfo 似乎工作正常。这是我遇到问题的 INotifyDataErrorInfo。
解决方案的一半:将绑定更改为 TwoWay 会导致行指示器正确显示,但它仍然不想消失。
这是视图:
<DataGrid ItemsSource="{Binding Items, ValidatesOnNotifyDataErrors=True}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name, ValidatesOnNotifyDataErrors=True,Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
这是视图模型:
public class Item : INotifyDataErrorInfo, INotifyPropertyChanged
{
Dictionary<string, IEnumerable<string>> _errors = new Dictionary<string,IEnumerable<string>>();
string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
ValidateProperty("Name", value);
_name = value;
RaisePropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string p)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
private void ValidateProperty(string p, object value)
{
if (p == "Name")
{
if (string.IsNullOrWhiteSpace((string)value))
_errors["Name"] = new[] { "Name is required." };
else
_errors["Name"] = new string[0];
}
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(null));
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
return _errors.Values.SelectMany(es2 => es2);
IEnumerable<string> es;
_errors.TryGetValue(propertyName ?? "", out es);
return es;
}
public bool HasErrors
{
get
{
var e = _errors.Values.Any(es => es.Any());
return e;
}
}
}
似乎已经在 SO 上提出了这个问题,但被原作者删除了:https ://stackoverflow.com/questions/18113718/wpf-datagridrow-inotifydataerrorinfo-as-tooltip-buggy?answertab=active 的副本原来的问题,但这里没有答案:http: //bolding-techaswere1.blogspot.com.au/2013/08/wpf-datagridrow-inotifydataerrorinfo-as.html
编辑:
这是我的测试源代码: https ://github.com/dcrowe/WPF-DataGrid-Validation-Issue/tree/master/DataGrid%20Validation%20Issue
这是我提交给 MS 的报告: https ://connect.microsoft.com/VisualStudio/feedback/details/807728/datagridrow-error-indicator-not-working-with-inotifydataerrorinfo