WPF Visual Studio Designer и Expression Blend не уважают TypeConverter в DependencyProperty - PullRequest
1 голос
/ 23 апреля 2010

Я добавил свойство зависимости MyList в текстовое поле wpf. Свойство зависимости имеет тип List . Чтобы упростить работу в xaml, я определил конвертер, чтобы у меня был следующий синтаксис:

<Grid>
    <controls:MyTextBox x:Name="Hello" MyList="One,Two" Text="Hello" />
</Grid>

В Visual Studio я вообще не могу редактировать свойство, а в Expression Blend я могу ввести строку, но она генерирует следующий xaml:

<controls:MyTextBox x:Name="Hello" Text="Hello" >
 <controls:MyTextBox.MyList>
  <System_Collections_Generic:List`1 Capacity="2">
   <System:String>One</System:String>
   <System:String>Two</System:String>
  </System_Collections_Generic:List`1>
 </controls:MyTextBox.MyList>
</controls:MyTextBox>

Есть идеи, как я могу просто отредактировать это свойство как строку в Visual Studio и Blend ??

public class MyTextBox : TextBox
{
    [TypeConverter(typeof(MyConverter))]
    public List<string> MyList
    {
        get { return (List<string>)GetValue(MyListProperty); }
        set { SetValue(MyListProperty, value); }
    }

    public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(List<string>), typeof(MyTextBox), new FrameworkPropertyMetadata(new List<string> { "one" }));
}


public class MyConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if(sourceType == typeof(string))
            return true;
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if(value is string)
            return new List<string>(((string)value).Split(','));    

        return base.ConvertFrom(context, culture, value);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if(destinationType == typeof(string))
            return true;
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if(destinationType == typeof(string))
        {
            var ret = string.Empty; 
            var s = ret;
            ((List<string>)value).ForEach(v => s += s + v + ",");
            ret = ret.Substring(0, ret.Length - 1);

            return ret;
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }
}

1 Ответ

0 голосов
/ 11 августа 2010

нет возможности сделать это с помощью дженериков, и разработчики VS и Blend сгенерируют информацию о коллекции с этими тегами при выполнении сериализации во время разработки. Обходной путь - создать собственный тип данных для MyList вместо List. (

Или

Затем необходимо сохранить MyList как свойство String, проанализировать последующие строки и сохранить их в List.

Или

Еще одно возможное решение. [если вы знаете значения списка ранее]

Вместо использования List<string> сделайте перечисление с флагами. Таким образом, вы можете получить ожидаемый выходной синтаксис как в VS Designer, так и в Blend без этих ненужных кодов.

НТН

...