我在 Visual Studio 2010 中尝试调试 Silverlight 4 应用程序时遇到此异常。该异常将在通过
InitializeComponent()
行后抛出。该异常只会在调试期间发生,但对于 Visual Studio Designer 来说似乎不是问题。
System.Windows.Markup.XamlParseException occurred
Message=Failed to create a 'System.Type' from the text 'local:CustomerEntity'. [Line: 11 Position: 59]
LineNumber=11
LinePosition=59
StackTrace:
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
at TestSilverlightApp.MainPage.InitializeComponent()
at TestSilverlightApp.MainPage..ctor()
InnerException:
所以我想做的是:我创建了这个
ViewModel
类,它具有 EntityType
类型的 System.Type
属性,该属性将在 XAML 中分配其值。
我创建了一个新的最小项目,它将重现相同的问题,请参见下文。
这是 Silverlight 应用程序的
RootVisual
。具有分配的 ViewModel
的 EntityType
在 UserControl.Resources
中声明。
我还将
ViewModel
绑定到 DataContext
并特意在主体中创建了一个 Run
元素,该元素绑定到 EntityType
参数。 Visual Studio 设计器可以毫无问题地显示指定的类型名称 EntityType
。
如果我没有在XAML中设置
EntityType
参数,就不会出现该错误。
<UserControl x:Class="TestSilverlightApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestSilverlightApp"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<local:ViewModel x:Key="rootViewModel" EntityType="local:CustomerEntity" />
</UserControl.Resources>
<StackPanel x:Name="LayoutRoot" DataContext="{StaticResource rootViewModel}">
<TextBlock><Run Text="{Binding EntityType}" /></TextBlock>
</StackPanel>
</UserControl>
这个异常会在经过下面的
InitializeComponent()
行后抛出。
namespace TestSilverlightApp
{
public partial class MainPage : System.Windows.Controls.UserControl
{
public MainPage()
{
InitializeComponent();
}
}
}
ViewModel 类有一个 EntityType 属性,它接受
System.Type
值。
namespace TestSilverlightApp
{
public class ViewModel
{
public System.Type EntityType { get; set; }
}
}
这只是我创建的一个空类,目的是将其类型分配给 ViewModel.EntityType 属性。
namespace TestSilverlightApp
{
public class CustomerEntity
{ }
}
知道如何解决这个问题吗?我宁愿不实现我自己的
TypeConverter
或在 XAML 中设置 System.Type
值的东西。
这是您可以使用的类型转换器:-
public class TypeTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(System.Type);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
return Type.GetType((string)value);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return value.ToString();
}
}
在您查看模型代码时使用:-
public class ViewModel
{
[TypeConverter(typeof(TypeTypeConverter))]
public System.Type EntityType { get; set; }
}
您不能使用命名空间别名来定义类型,它必须是静态
GetType
方法识别的类型:-
<local:ViewModel x:Key="rootViewModel" EntityType="TestSilverlightApp.CustomerEntity" />