Я новичок в WPF, и шаблон MVVM достаточно знакомо, чтобы я это понимаю. Приложение, над которым я работаю, является простым приложением входа в систему, когда кто-то посещает офис. Я использую инструментарий сообщества и пытаюсь очистить или обновить представление после отправки. Представление и проверка данных работы по начальной нагрузке и подчинению, но когда сброс (CLEAR) выполняется в модели представления, проверка запускается. class = "lang-cs prettyprint-override">public partial class SignInViewModel : ObservableValidator,INotifyDataErrorInfo,INotifyPropertyChanged
{
private string _firstName;
private string _lastName;
private string _email;
private string _companyName;
private string _host;
private bool _hasSignedNDA;
private readonly ErrorsViewModel _errorsViewModel;
private readonly Dictionary _propertyErrors = new();
[Required(AllowEmptyStrings = false, ErrorMessage = "First Name is required")]
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
_errorsViewModel.ClearErrors(nameof(FirstName));
_errorsViewModel.Validate(this,nameof(FirstName), value);
OnPropertyChanged(nameof(FirstName));
}
}
[Required(AllowEmptyStrings = false, ErrorMessage = "Last Name is required")]
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
_errorsViewModel.ClearErrors(nameof(LastName));
_errorsViewModel.Validate(this,nameof(LastName), value);
OnPropertyChanged(nameof(LastName));
}
}
[EmailAddress(ErrorMessage ="Must be a vaild email address")]
[Required(AllowEmptyStrings = false, ErrorMessage = "Email is required")]
public string Email
{
get { return _email; }
set
{
_email = value;
_errorsViewModel.ClearErrors(nameof(Email));
_errorsViewModel.Validate(this,nameof(Email), value);
OnPropertyChanged(nameof(Email));
}
}
public string CompanyName
{
get { return _companyName; }
set
{
_companyName = value;
_errorsViewModel.ClearErrors(nameof(CompanyName));
_errorsViewModel.Validate(this,nameof(CompanyName), value);
OnPropertyChanged(nameof(CompanyName));
}
}
[Required(AllowEmptyStrings = false, ErrorMessage = "Host is required")]
public string Host
{
get { return _host; }
set
{
_host = value;
_errorsViewModel.ClearErrors(nameof(Host));
_errorsViewModel.Validate(this,nameof(Host), value);
OnPropertyChanged(nameof(Host));
}
}
public bool HasSignedNDA
{
get { return _hasSignedNDA; }
set
{
_hasSignedNDA = value;
_errorsViewModel.ClearErrors(nameof(HasSignedNDA));
_errorsViewModel.Validate(this,nameof(HasSignedNDA), value);
OnPropertyChanged(nameof(HasSignedNDA));
}
}
public SignInViewModel()
{
_errorsViewModel =new ErrorsViewModel();
_errorsViewModel.ErrorsChanged += ErrorsViewModel_ErrorsChanged;
}
private void ErrorsViewModel_ErrorsChanged(object sender, DataErrorsChangedEventArgs e)
{
ErrorsChanged?.Invoke(this, e);
OnPropertyChanged(nameof(CanSignIn));
}
public bool HasErrors => _errorsViewModel.HasErrors;
public event EventHandler? ErrorsChanged;
public IEnumerable GetErrors(string propertyName)
{
return _errorsViewModel.GetErrors(propertyName);
}
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
}
public bool CanSignIn => !HasErrors;
// public ICommand SignInCommand { get; }
[RelayCommand()]
public void SignIn()
{
var isValid= Validator.TryValidateObject(this, new ValidationContext(this), new List(), true);
if (isValid)
{
//truncated for brevity
ClearForm(this);
}
}
private void ClearForm(SignInViewModel viewModel)
{
if (viewModel != null)
{
viewModel.FirstName = string.Empty;
viewModel.LastName = string.Empty;
viewModel.CompanyName = string.Empty;
viewModel.Email = string.Empty;
viewModel.Host = string.Empty;
viewModel.HasSignedNDA = false;
}
}
< /code>
Просмотреть код за < /p>
public partial class SignInPage : Page
{
public SignInViewModel ViewModel;
//public ICommand Command_SignIn;
public SignInPage()
{
InitializeComponent();
ViewModel = new();
DataContext = ViewModel;
}
private void Command_SignIn(object sender, RoutedEventArgs e)
}
< /code>
xaml < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... view-model