I implement INotifyDataErrorInfo for my class ,It shows exception right in GridView But allow user to exit cell with invalid data.
I want to force user to correct data before leaving cell how can I do that?
public
class TestClass : INotifyDataErrorInfo
{
int code;
public int Code
{
get {return code; }
set
{
IsCodeValid(value);
if (code != value) code = value;
}
}
string name;
public string Name
{
get {return name; }
set {name = value; }
}
public bool IsCodeValid(int value)
{
bool isValid = true;
if (value == 0)
{
AddError("Code", "Code Err!", false);
isValid = false;
}
else RemoveError("Code", "Code Err!");
return isValid;
}
private Dictionary<String, List<String>> errors = new Dictionary<string, List<string>>();
public void AddError(string propertyName, string error, bool isWarning)
{
if (!errors.ContainsKey(propertyName))
errors[propertyName] = new List<string>();
if (!errors[propertyName].Contains(error))
{
if (isWarning) errors[propertyName].Add(error);
else errors[propertyName].Insert(0, error);
RaiseErrorsChanged(propertyName);
}
}
public void RemoveError(string propertyName, string error)
{
if (errors.ContainsKey(propertyName) && errors[propertyName].Contains(error))
{
errors[propertyName].Remove(error);
if (errors[propertyName].Count == 0) errors.Remove(propertyName);
RaiseErrorsChanged(propertyName);
}
}
public void RaiseErrorsChanged(string propertyName)
{
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
#region
INotifyDataErrorInfo Members
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (String.IsNullOrEmpty(propertyName) || !errors.ContainsKey(propertyName))
return null;
return errors[propertyName];
}
public bool HasErrors
{
get { return errors.Count > 0; }
}
#endregion
}
<telerik:RadGridView Name="radGridView1" AutoGenerateColumns="False" ItemsSource="{Binding ColData}" >
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn Header="Code" DataMemberBinding="{Binding Code}" ValidatesOnDataErrors="Default" />
<telerik:GridViewDataColumn Header="Name" DataMemberBinding="{Binding Name}" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>