2011-05-27 69 views
11

如果我有下面的文本框:WPF簡單的驗證問題 - 設置自定義ErrorContent

<TextBox Height="30" Width="300" Margin="10" Text="{Binding IntProperty, 
     NotifyOnValidationError=True}" Validation.Error="ContentPresenter_Error"> 
</TextBox> 

這在代碼隱藏:

private void ContentPresenter_Error(object sender, ValidationErrorEventArgs e) { 
    MessageBox.Show(e.Error.ErrorContent.ToString()); 
} 

如果我輸入在文本框中輸入字母「X」 ,彈出的消息是

值「x」的不能轉換

有沒有辦法自定義此消息?

+0

爲什麼不把自己的字符串放在MessageBox.Show();? – Terrance 2011-05-27 14:07:03

+0

因爲我可能有很多其他的文本框,並且最好有一個驗證錯誤處理程序,它只是接收最新驗證錯誤的錯誤內容。 – 2011-05-27 14:09:30

回答

10

我不喜歡回答我的問題,但它似乎做到這一點的唯一方法是實現一個有效性規則,像什麼的下面(有可能是在它的一些錯誤):

public class BasicIntegerValidator : ValidationRule {  

    public string PropertyNameToDisplay { get; set; } 
    public bool Nullable { get; set; } 
    public bool AllowNegative { get; set; } 

    string PropertyNameHelper { get { return PropertyNameToDisplay == null ? string.Empty : " for " + PropertyNameToDisplay; } } 

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { 
     string textEntered = (string)value; 
     int intOutput; 
     double junkd; 

     if (String.IsNullOrEmpty(textEntered)) 
      return Nullable ? new ValidationResult(true, null) : new ValidationResult(false, getMsgDisplay("Please enter a value")); 

     if (!Int32.TryParse(textEntered, out intOutput)) 
      if (Double.TryParse(textEntered, out junkd)) 
       return new ValidationResult(false, getMsgDisplay("Please enter a whole number (no decimals)")); 
      else 
       return new ValidationResult(false, getMsgDisplay("Please enter a whole number")); 
     else if (intOutput < 0 && !AllowNegative) 
      return new ValidationResult(false, getNegativeNumberError()); 

     return new ValidationResult(true, null); 
    } 

    private string getNegativeNumberError() { 
     return PropertyNameToDisplay == null ? "This property must be a positive, whole number" : PropertyNameToDisplay + " must be a positive, whole number"; 
    } 

    private string getMsgDisplay(string messageBase) { 
     return String.Format("{0}{1}", messageBase, PropertyNameHelper); 
    } 
} 
+0

你大概可以接受你自己的答案:我搜索了一段時間,但沒有找到另一個解決方案比這.. – stijn 2011-06-30 19:46:34

+1

所以 - 至少直到有人來與更好的東西:) – 2011-06-30 19:54:37

4

您可以使用ValidationRules 。

<DataGridTextColumn x:Name="Column5" Header="{x:Static p:Resources.Waste_perc}" Width="auto"> 
    <DataGridTextColumn.Binding> 
     <Binding Path="Waste" ValidatesOnDataErrors="True" UpdateSourceTrigger="LostFocus"> 
      <Binding.ValidationRules> 
       <myLib:DecimalRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </DataGridTextColumn.Binding> 
</DataGridTextColumn> 

和這裏的:

舉例來說,在我的情況下,當用戶輸入而不是默認的消息無效值成十進制datagridtextcolumn,「價值無法轉換」我可以重寫它DecimalRule的代碼:

public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{ 
    decimal convertedDecimal; 
    if (!decimal.TryParse((string)value, out convertedDecimal)) 
    { 
     return new ValidationResult(false, "My Custom Message")); 
    } 
    else 
    { 
     return new ValidationResult(true, null); 
    } 
}