簡體   English   中英

如何在WPF MVMVM中禁用按鈕直到良好驗證

[英]How to disable button until good validation in wpf mvvm

在良好的文本框驗證之前,如何禁用按鈕? 我已經做了一些工作,但是我不知道如何隱藏按鈕,直到使用MVVM模式以正確的方式進行良好的驗證為止。 我仍在學習此MVVM模式。 這是我的代碼片段:

ValidationRule類:

public class NotEmptyValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return string.IsNullOrWhiteSpace((value ?? "").ToString())
            ? new ValidationResult(false, "Field is required")
            : ValidationResult.ValidResult;
    }
}

xaml:

<TextBox
Style="{StaticResource MaterialDesignFilledTextFieldTextBox}"
AcceptsReturn="True"
TextWrapping="Wrap"
materialDesign:HintAssist.Hint="Content"
IsEnabled="{Binding Path=IsChecked, 
ElementName=MaterialDesignOutlinedTextFieldTextBoxEnabledComboBox}" 
MaxLength="1000" materialDesign:ValidationAssist.UsePopup="True">
        <TextBox.Text>
            <Binding Path="Task.Content" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <domain:NotEmptyValidationRule
                     ValidatesOnTargetUpdated="True" />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

ViewModel:

private ICommand _submitCommand;
public ICommand SubmitCommand
{
   get
   {
       if (_submitCommand == null)
       {
          _submitCommand = new RelayCommand(SubmitExecute, anSubmitExecute, false);
       }
       return _submitCommand;
    }
}

private void SubmitExecute(object parameter)
{
     Task.Id++;
     Tasks.Add(Task);
}

private bool CanSubmitExecute(object parameter)
{
     // What can I do to prevent to show this button when validation 
     // failed
     return true;
}

您應該在Task類中實現INotifyDataErrorInfo接口,或者在視圖模型類中實現它並包裝數據綁定的Task.Content屬性,例如:

private RelayCommand _submitCommand;
public ICommand SubmitCommand
{
    get
    {
        if (_submitCommand == null)
        {
            _submitCommand = new RelayCommand(SubmitExecute, CanSubmitExecute, false);
        }
        return _submitCommand;
    }
}

private void SubmitExecute(object parameter)
{
    Task.Id++;
    Tasks.Add(Task);
}

public string Content
{
    get { return Task.Content; }
    set
    {
        Task.Content = value;
        if (string.IsNullOrEmpty(Task.Content))
            _validationErrors[nameof(Content)] = "Field is required";
        else
            _validationErrors.Remove(nameof(Content));
        ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(nameof(Content)));
        _submitCommand.RaiseCanExecuteChanged();
    }
}

private bool CanSubmitExecute(object parameter)
{
    return HasErrors;
}

#region INotifyDataErrorInfo
private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();

public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

public System.Collections.IEnumerable GetErrors(string propertyName)
{
    if (string.IsNullOrEmpty(propertyName)
        || !_validationErrors.ContainsKey(propertyName))
        return null;

    return new string[1] { _validationErrors[propertyName] };
}

public bool HasErrors
{
    get { return _validationErrors.Count > 0; }
}
#endregion

XAML:

<TextBox Text="{Binding Content, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True}" />

您不應使用驗證規則。 它們不是MVVM友好的。 請參閱博客文章以獲取更多信息。

您還需要引發ICommandCanExecuteChanged事件。 如何執行取決於實施方式。 大多數實現都有一個稱為RaiseCanExecuteChanged()或類似方法的方法。

WPF 4.5:使用INotifyDataErrorInfo接口驗證數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM