我想知道如何在XAML中为Silverlight分配类型为Type的依赖项属性,因为标记扩展名{x:Type}不存在?
谢谢,
答案 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"/>