簡體   English   中英

使用MVVM時如何禁用驗證錯誤按鈕?

[英]How to disable button on validation error when using MVVM?

到目前為止,我正在學習MVVM,到目前為止,除了在驗證時禁用按鈕外,我還算不錯。 我的驗證工作正常,因此禁用按鈕部分並非如此。 這是我的代碼:

ViewModelBase:

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我的驗證班:

public class NumberValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (String.IsNullOrEmpty(value.ToString()))
        {
            return new ValidationResult(false, "No debe estar vacio");
        }
        double result = 0;
        bool canConvert = double.TryParse(value as string, out result);
        return new ValidationResult(canConvert, "No es numero valido");
    }


}

和我的ViewModel:

public class CommercePayment : ViewModelBase
{
    private ICommand _SubmitCommand;
    private PayCommerce _payCommerce;

    public PayCommerce PayCommerces
    {
        get
        {
            return _payCommerce;
        }
        set
        {
            _payCommerce = value;
            NotifyPropertyChanged("PayCommerces");
        }
    }


    public CommercePayment()
    {
        PayCommerces = new PayCommerce();
    }

    void PayCommerce_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        NotifyPropertyChanged("PayCommerces");
    }
    public void Submit()
    {
        var test = PayCommerces.AccountNumber;
        var test2 = PayCommerces.PaymentAmount;
 //          var test2 = PayCommerces.Commerce.MerchantFullName;
    }





    #region Helpers
    public ICommand SubmitCommand
    {
        get
        {
            if (_SubmitCommand == null)
            {
                _SubmitCommand = new RelayCommand(param => this.Submit(),
                    null);
            }
            return _SubmitCommand;
        }
    }
    #endregion
}

}

我的XML以這種方式綁定:

<Controls:Tile x:Name="tlProcesar" Title="" 
                TiltFactor="2"
                Width="Auto" Height="Auto" 
                Count="Procesar"
                Command="{Binding SubmitCommand}" Margin="185,189,200,-59"
                           >
            </Controls:Tile>

在我的后台代碼中,我有這個(正在測試和學習):

    private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = IsValid(sender as DependencyObject);

    }
    private void Save_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        ViewModel.CommercePayment payments = new ViewModel.CommercePayment();
        payments.Submit();
    }


    private bool IsValid(DependencyObject obj)
    {
        return !Validation.GetHasError(obj) && LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>().All(IsValid);
    }

如果我將控件綁定更改為:

 Command="ApplicationCommands.Save"

然后禁用了該按鈕,但是我當然沒有在ViewModel的Submit()方法中獲得任何數據,因為它沒有綁定。 如果我保持原樣,即使驗證失敗,該按鈕仍然可以使用。 我能做什么?

更新1:

創建此:

public bool IsValid
    {
        get { return _isValid; }
        set
        {
            _isValid = value;
            NotifyPropertyChanged("IsValid");
        }
    }

現在我想我需要將其與驗證相關聯嗎?

通常,您可以將Button的IsEnabled屬性綁定到xaml.cs中的屬性,並返回“ IsValid”狀態。

<Controls:Tile x:Name="tlProcesar" Title="" 
  TiltFactor="2"
  Width="Auto" Height="Auto" 
  Count="Procesar"
  Command="{Binding SubmitCommand}" Margin="185,189,200,-59"
  IsEnabled="{Binding IsValidProperty}">
</Controls:Tile>

我可以看到您在您的設置中混合了兩種驗證解決方案,一種發生在視圖中,另一種發生在視圖模型中。

您正在實現NumberValidation類,但是我看不到任何使用它的xaml代碼。 您需要在xaml代碼中使用它,如下所示:

<TextBox.Text>
  <Binding Path="PayCommerces">
    <Binding.ValidationRules>
      <val:NumberValidation/>
    </Binding.ValidationRules>
  </Binding>
</TextBox.Text>

但是,如果使用此方法,則在View層中完成驗證。 因此,這意味着您的ViewModel不知道它有錯誤,並且IsValid不會檢測到有錯誤。

如果要在視圖中放置所有驗證,請使用多重綁定在錯誤控件和按鈕之間添加綁定。 您可以在此處查看示例。 禁用驗證錯誤按鈕

但是,相反,如果您希望在ViewModel中進行驗證,則需要視圖模型來實現IDataErrorInfo接口。 然后,您的NumberValidation類將無用。

暫無
暫無

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

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