0

List<string> TagsTextBoxに表示したいクラスがあります。このために、私は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}" />

ただし、エラーは表示されません。変換が原因かもしれませんが、どうすれば検証を実行できますか?

4

1 に答える 1

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

Convertメソッドに関するもう1つの注意点として、Joinメソッドを使用できます。

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

そして、文字列を組み合わせる方法についてもう1つ。演算子+は使用しないでください。パフォーマンスの問題が発生する可能性があるため、代わりにStringBuilderを使用してください。

于 2012-08-17T16:27:13.150 に答える