wpf INotifyDataErrorInfo如何强制视图为getErrors()?

rxztt3cl  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(130)

我在.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>
kcwpcxri

kcwpcxri1#

如果您在保存时触发验证(例如,不在您的集合{}中),则它知道验证的唯一时间是您再次单击保存时。
我会给你的设定增加一些逻辑;所以它在LostFocus上亲自验证
如果你还没有听说过'mvvm community toolkit'的话,这里也要做一个一般性的说明。使用ObservableValidator类可以为你做很多困难的工作https://learn.microsoft.com/en-us/windows/communitytoolkit/mvvm/observablevalidator

w8f9ii69

w8f9ii692#

是否有办法强制视图(绑定引擎)强制GetErrors()...?
实作INotifyPropertyChanged并引发数据系结来源属性(BrojTransakcije)的PropertyChanged事件。如需详细信息,请参阅this回应。

相关问题