2010-04-23 3 views
1

J'ai ajouté la propriété de dépendance MyList à une zone de texte wpf. La propriété de dépendance est de type Liste < chaîne >. Afin de rendre les choses plus faciles en XAML j'ai défini un convertisseur pour que je puisse avoir la syntaxe suivante:WPF Visual Studio Designer et Expression Blend ne respectent pas TypeConverter sur DependencyProperty

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

Dans Visual Studio, je ne peux pas modifier la propriété du tout et dans Expression Blend je peux taper dans la chaîne mais il génère le XAML suivant:

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

Toute idée comment je peux modifier cette propriété comme une chaîne dans 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); 
    } 
} 

Répondre

0

il n'y a pas possibilité de le faire avec les génériques, les deux VS Blend et les concepteurs généreront les informations de collection avec ces balises tout en faisant sérialisation temps de conception. Une solution consiste à créer votre propre type de données pour MyList au lieu de List. :(

Ou

Vous devez garder le MyList comme une propriété de chaîne puis, analyser les chaînes suivantes et de les stocker dans une liste.

Ou

Une solution plus possible. [Si vous connaître les valeurs de la liste plus tôt]

Au lieu d'utiliser un List<string> en faire une énumération avec des drapeaux afin que vous puissiez obtenir la syntaxe de sortie attendue dans VS Designer et Blend sans ces codes de courrier indésirable

HTH