2010-03-15 3 views

Répondre

3

Selon vos besoins, il peut y avoir une série d'approches différentes à prendre. Ce qui suit est une solution très générale.

Créer un convertisseur de valeur qui convertit une chaîne à un type: -

public class StringToTypeConverter : IValueConverter 
{ 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Type.GetType((string)value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Placez une instance de ce convertisseur dans le dictionnaire des ressources dont l'objet de destination a la visibilité, prononcez le App.xaml: -

<Application.Resources> 
     <local:StringToTypeConverter x:Key="STT" /> 
    </Application.Resources> 

maintenant dans votre XAML vous pouvez attribuer une valeur à une propriété comme celui-ci: -

<TextBox Text="{Binding Source='System.Int32,mscorlib', Converter={StaticResource STT}}" /> 
+0

J'ai une exception quand je l'utilise sur un type personnalisé si je ne spécifie pas la version, mais votre solution semble être le meilleur que nous pouvons faire :( –

+0

@Nicolas Dorier: Pour un type personnalisé, essayez simplement d'utiliser le nom de type seul (c'est-à-dire, au lieu d'ajouter un numéro de version, supprimez le nom de l'assembly). Si le type personnalisé est dans le même assembly que votre Xaml/Usercontrol qui utilise cette technique qui devrait fonctionner. – AnthonyWJones

2

Une autre approche consiste à décorer la propriété elle-même avec un convertisseur de type.

Définir un TypeConverter comme ceci:

public class StringToTypeConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
    return sourceType.IsAssignableFrom(typeof (string)); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
    { 
     var text = value as string; 
     return text != null ? Type.GetType(text) : null; 
    } 
} 

décorez votre bien comme ceci:

[TypeConverter(typeof(StringToTypeConverter))] 
public Type MessageType 
{ 
    get { return (Type) GetValue(MessageTypeProperty); } 
    set { SetValue(MessageTypeProperty, value); } 
} 

Et puis dans votre XAML vous pouvez faire ceci:

<MyObject MessageType="My.Fully.Qualified.Type"/> 
Questions connexes