我在.net framework 4中使用WPF开发了一个桌面应用程序,并尝试使用MVVM设置我的字段验证。我已经在我的EntryClass上实现了INotifyDataErrorInfo接口,该接口正在MainWindowViewModel中使用。
接口实现已完成,因此我的属性不会在set{}内的propertychange上验证,而是在用户单击“保存”按钮后验证。
public bool IsFormValid()
{
bool valid = true;
_errorHandler.ClearAllErrors();
if (BrojTransakcije==null || BrojTransakcije.Length<4)
{
_errorHandler.AddError(nameof(BrojTransakcije), "Invalid chars");
valid = false;
}
return valid;
}
它的工作原理是,在单击“保存”后,我首先清除所有属性(并引发ErrorsChanged()),检查属性,如果它无效,则在视图中显示错误。
private void RaiseErrorChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
public void ClearAllErrors()
{
_formGreske.Clear();
RaiseErrorChanged(string.Empty); //reset everything
}
我遇到的问题是:用户输入正确的值后,验证通过,但错误信息仍保留在屏幕上,不会更新。如果用户在输入的值上附加一些内容并再次单击“保存”,错误将消失。
我已经把范围缩小到视图(我想是绑定引擎)没有调用接口的GetErrors()方法,并且它不知道错误被清除了。有没有办法强迫视图(绑定引擎)强制GetErrors(),因为显然它没有这样做?
<StackPanel>
<Label Style="{StaticResource LabelTitles}"
Content="Broj transakcije"></Label>
<TextBox Style="{StaticResource InputBox}"
Text="{Binding NoviUnos.BrojTransakcije,
ValidatesOnNotifyDataErrors=True}">
</TextBox>
</StackPanel>
2条答案
按热度按时间kcwpcxri1#
如果您在保存时触发验证(例如,不在您的集合{}中),则它知道验证的唯一时间是您再次单击保存时。
我会给你的设定增加一些逻辑;所以它在LostFocus上亲自验证
如果你还没有听说过'mvvm community toolkit'的话,这里也要做一个一般性的说明。使用ObservableValidator类可以为你做很多困难的工作https://learn.microsoft.com/en-us/windows/communitytoolkit/mvvm/observablevalidator
w8f9ii692#
是否有办法强制视图(绑定引擎)强制GetErrors()...?
实作
INotifyPropertyChanged
并引发数据系结来源属性(BrojTransakcije
)的PropertyChanged
事件。如需详细信息,请参阅this回应。