2014-10-28 64 views
0

我想要驗證一些TextTextBlockWPF爲什麼不顯示錯誤消息?

的TextBlock XAML:

<TextBlock x:Name="numInput" Validation.ErrorTemplate="{StaticResource errorTemplate}" > 
    <TextBlock.Text> 
     <Binding Path="Text" RelativeSource="{RelativeSource self}" NotifyOnValidationError="True"> 
      <Binding.ValidationRules> 
       <local: NumberValidator /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBlock.Text> 
</TextBlock> 

Text在代碼隱藏在GUI添加一些按鈕點擊(即觸摸屏)

errorTemplate

<ControlTemplate x:Key="errorTemplate"> 
    <StackPanel> 
     <TextBlock Foreground="Red">error msg</TextBlock> 
     <AdornedElementPlaceholder/> 
    </StackPanel> 
</ControlTemplate> 

的NumberValidator

class NumberValidator : ValidationRule { 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { 
     Console.WriteLine("validating numbers!!"); 
     int num = -1; 
     try { 
      num = Int32.Parse(value.ToString()); 
     } 
     catch (Exception e) { 
      return new ValidationResult(false, "input must be numbers!"); 
     } 

     if (num > 999 || num < 1) { 
      return new ValidationResult(false, string.Format("must be integers from {0} to {1}", 1, 999)); 
     } 
     return new ValidationResult(true, null); 
    } 
} 

問題:

  1. 示出沒有錯誤消息。實際上,NumberValidator甚至沒有被調用。爲什麼?

  2. 如何僅在單擊Button時驗證錯誤?

  3. 如何將有效範圍(即最小,最大)信息傳遞給NumberValidator

謝謝!

回答

2

我假設你想在源到目標方向執行驗證(爲模型錯誤提供可視反饋),因此我的答案只適用於這種情況。

  1. 驗證規則是由設計只有在目標 - 源方向(這裏的主要思想是,以驗證用戶輸入)檢查,所以當您更改模型中的價值,驗證規則不檢查。爲了執行從源到目標方向的驗​​證,您的模型應該實現IDataErrorInfoINotifyDataErrorInfo(後者僅在.NET 4.5或更高版本中受支持),ValidatesOnDataErrors應該在綁定上設置爲true

  2. 每次更新綁定時都會進行驗證,因此如果按鈕單擊更新模型上的屬性(或更具體地說,會引發PropertyChanged事件),將執行驗證。請注意,如果在某些其他情況下更改了屬性,驗證也將執行,因此,爲了僅在按鈕單擊時執行驗證,請確保僅在此時更改屬性(或者引發PropertyChanged)。

  3. 儘管使用ValidationRule衍生品是不是在情景假設合適的方法,答案是對NumberValidator類中定義MaxMin屬性,然後在XAML中使用它們像這樣:<local:NumberValidator Min="0" Max="100"/>

有關綁定的更多信息,請參見Data Binding Overview