![](/img/trans.png)
[英]CanExecute does not disable button when dataTemplate validation mvvm wpf
[英]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.