2016-08-01 4 views
2

현재 MVVM 및 IDataErrorInfo을 사용하여 간단한 데이터 입력 응용 프로그램에서 내 TextBox의 입력을 확인합니다. 사용자가 아닌 수가 유입되면 I은 적색 배경으로 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> 

를 입력 된 값이 유효한 입력되면 I는 (? 오렌지 배경)의 시각적 표시를 제공하고 싶지만 "out of spec"또는 유사한 것. 여러 "오류 검증"유형에 대한 나의 옵션은 무엇입니까?

+1

아니요. IDEI는 문자열 만 반환하므로 몇 가지 추가 정보를 인코딩하고 하나의 변환기를 사용하여 인코딩 된 메타 데이터의 시각을 변경 한 다음 다른 변환기를 사용하여 메시지를 가져와야합니다. 조금은 어색하지만 변환기가 두 개인 경우 스윙을 할 수 있습니다. 해커,하지만 빨리. 또는 유효성 검사 시스템에 연결하여 데이터 오류 인터페이스의 다른 풍미를 사용하도록 수정할 수도 있습니다. 필자는 한번도 해본 적이 없지만, 시도해 보았다면 소스가 어떻게 작동하는지 그리고 유효성 검사 파이프에 들어갈 수있는 곳을 조사해야 할 것입니다. – Will

+0

@ 감사합니다. 나는 단지''INotifyDataErrorInfo''에서 일어난 일입니다 - 그것은 내가 원하는 것을하기위한 (명시적인) 기능을 포함하고 있습니까? – Conrad

+2

다시 말하지만 인터페이스에서 반환 된 오류는 문자열입니다. 문자열을 확장 할 수 없으므로 UI의 유효성 검사에 어떻게 든 연결되고 디자인의 다른 유효성 검사 인터페이스를 사용하거나 변환기를 사용하여 오류에 대한 메타 데이터를 문자열에 인코딩 할 수 있습니다. – Will

답변

0

내가 @Will에 의해 제안을 구현 결국 [.NET 프레임 워크 4.5.1을 사용]

. 각각의 IDataErrorInfo 오류 문자열의 시작 부분에 하나의 문자를 삽입했습니다 (이 경우 필요한 모든 것은 2 개의 옵션이므로 "0"과 "1"을 사용했습니다). 나는 2 IValueConverter을 만들었습니다. [배경 및 도구 설명 속성 각각에 대해 하나

<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 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 스타일을 수정

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; 
      ... 
     } 
    } 
} 

모든 것이 잘 작동합니다!