2016-08-01 42 views
2

我目前使用MVVM和IDataErrorInfo驗證輸入在我的TextBox es在一個簡單的數據錄入應用程序。我目前標誌着TextBox紅色背景,如果用戶輸入一個非數字:測試錯誤和「其他」值

<Style TargetType="TextBox"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="True"> 
      <Setter Property="Background" Value="Pink"/> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors)[0].ErrorContent}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

不過,我想也給視覺指示器(?橙色背景),如果輸入的值是一個有效的輸入,但「超出規格」或類似。我有多個「錯誤驗證」類型的選項?

[使用.NET Framework 4.5.1]

+1

不是。 IDEI只返回字符串,因此您必須編碼一些其他信息,使用一個轉換器更改編碼元數據上的視覺效果,然後使用不同的轉換器來獲取消息。這有點不可思議,但有幾個不同的轉換器,你可以擺動它。哈克,但很快。或者,您也可以掛鉤驗證系統並修改它以使用不同的數據錯誤界面。我從來沒有這樣做過,但如果我嘗試過,我必須深入研究源代碼,看看它是如何工作的,以及我可以進入驗證管道的位置。 – Will

+0

@謝謝。我剛剛發生了「INotifyDataErrorInfo」 - 是否包含(顯式)設施來執行我想要的操作? – Conrad

+2

否。從界面返回的錯誤是字符串。您無法擴展字符串,因此您可以以某種方式在UI中進行驗證並使用設計的不同驗證界面,或者使用轉換器並以某種方式將有關錯誤的元數據編碼爲字符串。 – Will

回答

0

我最終落實@Will的建議。我在每個IDataErrorInfo錯誤字符串(在這種情況下,我需要的只有2個選項,因此我使用「0」和「1」)的開頭處插入了一個字符。我創建了2 IValueConverter s;爲每個背景和工具提示屬性:

public class WarningErrorBkgdConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     char firstChar = ((string)value)[0]; 
     if (firstChar == '0') 
     { 
      return Brushes.Pink; // Error 
     } 

     Debug.Assert(firstChar == '1', "CANTHAPPEN: Expecting 1st char of string to be 1, was " + firstChar); 
     return Brushes.Gold; // Warning 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 



public class WarningErrorTextConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // Just ignore the error code 
     return ((string)value).Substring(1); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

我修改了TextBox風格從原來的問題將這些轉換器:

<local:WarningErrorBkgdConverter x:Key="warningErrorBkgdConverter"/> 
<local:WarningErrorTextConverter x:Key="warningErrorTextConverter"/> 
<Style TargetType="TextBox"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="True"> 
      <Setter Property="Background" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
       Path=(Validation.Errors)[0].ErrorContent, 
       Converter={StaticResource warningErrorBkgdConverter}}"/> 
      <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
       Path=(Validation.Errors)[0].ErrorContent, 
       Converter={StaticResource warningErrorTextConverter}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

然後在我的IDataErrorInfo實施,樣例用法:

public string this[string propertyName] 
{ 
    get 
    { 
     uint testUint; 

     switch (propertyName) 
     { 
      case "YieldPsi1": 
       if (YieldPsi1 == "") 
        return null; 

       if (!UInt32.TryParse(YieldPsi1, out testUint)) 
        return "0Must be a number"; 

       if (testUint < 42000) 
        return "1Out of spec"; 

       return null; 
      ... 
     } 
    } 
} 

一切正常!