如何创建Type类型的依赖项属性,并在XAML中分配它?

时间:2010-03-15 09:05:04

标签: .net silverlight

我想知道如何在XAML中为Silverlight分配类型为Type的依赖项属性,因为标记扩展名{x:Type}不存在?

谢谢,

2 个答案:

答案 0 :(得分:3)

根据您的要求,可能会采取一系列不同的方法。以下是非常普遍的解决方案。

创建一个将字符串转换为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
}

将此转换器的实例放在资源字典中,目标对象具有可见性,例如App.xaml: -

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

现在,在您的Xaml中,您可以为属性分配一个值,如下所示: -

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

答案 1 :(得分:2)

另一种方法是使用类型转换器装饰属性本身。

像这样定义一个TypeConverter:

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

像这样装饰你的财产:

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

然后在你的XAML中你可以这样做:

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