2012-08-17 17 views
0

我有一个类,我想在文本框中显示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 []),但是属性需要List类型的对象,所以你只需要更新ConvertBack方法:有关转换方法

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

还要说明一点,你可以用加入方法:

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

还有一件事相结合的字符串。不要使用operator +,因为你可能会遇到性能问题,请改用StringBuilder。

+0

有一个愚蠢的错误,将对象设置为CurrentItem,定义了EditTemplate而不是使用我使用的Object.Property的属性名称:-( – jwillmer 2012-08-23 08:20:40

相关问题