2015-10-22 41 views
2

我看到:禁用保存按鈕,如果驗證結果是假的,通過使用自定義有效性規則

Using WPF Validation rules and disabling a 'Save' button

兩個提出的解決方案使用IDataErrorInfo 或通過 Validation.AddErrorHandler()附加處理程序Validation.ErrorEvent。 AddErrorHandler接受兩個參數,依賴對象和處理程序。因爲我在ViewModel中這樣做,並且沒有參考DO,所以我如何通過使用我的自定義規則進行驗證來實現這一點。

的驗證規則:

public class NameValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    {  
     if (string.IsNullOrWhiteSpace(((string)value))) 
     { 
      return new ValidationResult(false, "Must not be empty"); 
     } 

     return new ValidationResult(true, null); 
    } 
} 

而且使用它的控制:

<TextBox> 
    <TextBox.Text> 
     <Binding Path="Customer.FirstName" UpdateSourceTrigger="LostFocus" ValidatesOnDataErrors="True"> 
      <Binding.ValidationRules> 
       <validators:NameValidationRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

<Button Content="Save" Command="{Binding SaveAddCommand}" CommandParameter="{Binding Customer}"/> 

那麼,有沒有一個「MVVM」的方式來改變SaveAddCommandCanExecute當文本框驗證規則返回false,而不需要將代碼中的依賴對象提供給AddHandler

回答

0

我認爲這應該工作:

public class NameValidationRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
      if (string.IsNullOrWhiteSpace(((string)value))) 
      { 
       return new ValidationResult(false, "Must not be empty"); 
       ButtonSave.IsEnabled = false; 
      } 

      return new ValidationResult(true, null); 
     } 
    } 

我希望它爲你工作;)

0

一種方式做到這一點是讓你Command實現提高CanExecuteChanged這將重新查詢命令CanExecute方法。
如果您可以通過在Customer虛擬機上創建事件,您的MainViewModel可以像客戶一樣知道孩子虛擬機的變化。因此,當物業在Customer中設置時,MainViewModel然後可以提升CanExecuteChanged並重新評估指定命令的條件。這將消除對定製驗證的需求,所有這些將一起離開MainViewModelCommand控制按鈕的可用性,就像WPF預計的那樣。
HTH
P.S.讓我們知道,如果你需要更多的幫助,快樂編碼
編輯:這是假設您的MainViewModelSaveAddCommand

相關問題