2012-08-17 2 views
0

TextBox에 표시 할 List<string> Tags 클래스가 있습니다. 이를 위해 IValueConverter를 사용합니다.IDataErrorInfo 및 IValueConverter를 통한 오류 확인

ListToStringConverter :

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var list = value as List<string>; 
    var returnvalue = string.Empty; 

    if(list != null) 
     list.ForEach(item => returnvalue += item + ", "); 
    return returnvalue; 
} 

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var strValue = value as string; 

    if(strValue != null) 
     return strValue.Split(new char[] { ',' }); 

    return null; 
} 

클래스 테스트 :

public class Test : IDataErrorInfo 
{ 
    public Test() 
    { 
     Tags = new List<string>(); 
    } 

    public List<string> Tags { get; set; } 

    string errors; 
    const string errorsText = "Error in Test class."; 
    public string Error 
    { 
     get { return errors; } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      errors = null; 
      switch (propertyName) 
      { 
       case "Tags": 
        if (Tags.Count <= 1) 
        { 
         errors = errorsText; 
         return "...more tags plz.."; 
        } 
        break; 
      } 
      return null; 
     } 
    } 
} 

가 지금은 태그의 유효성을 검사하려면 :

<TextBox Text="{Binding Test.Tags, Converter={StaticResource ListToStringConverter}, Mode=TwoWay, ValidatesOnDataErrors=True}" /> 

그러나 표시 오류가 없습니다. 어쩌면 변환 때문에하지만 어떻게 여전히 유효성 검사를 수행 할 수 있습니까?

답변

0

왜 작동하지 않아야하는지 알 수 없습니다. 처음 실행할 때 - SL이 빨간색 테두리로 TextBox를 강조 표시합니다. 그러나 태그 목록을 변경하려고하면 변환기에서 ConvertBack에 문자열 배열 (string [])을 반환하지만 Property에 List 유형의 개체가 있어야하므로 아무 것도 볼 수 없습니다. 단지에 ConvertBack 방법을 업데이트해야합니다 : 문자열을 결합에 대한

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var list = value as List<string>; 
    if (list != null) 
     return String.Join(", ", list); 
    return null; 
} 

그리고 한 가지 더 : 변환 방법에 대한

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var strValue = value as string; 

    if (strValue != null) 
     return strValue.Split(new char[] { ',' }).ToList(); 

    return null; 
} 

한 번 더 참고, 당신은 방법을 가입 할 수 있습니다. 연산자 +를 사용하지 마십시오. 성능 문제가 있기 때문에 StringBuilder를 대신 사용하십시오.

+0

어리석은 실수가 있었다면, 객체를'CurrentItem'으로 설정하고,'EditTemplate'을 정의하고,'Objects.Property'를 사용한 Propertienames 대신에 :-( – jwillmer

관련 문제