XamlParseException:无法从文本“local:CustomerEntity”创建“System.Type”

问题描述 投票:0回答:1

我在 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 中分配其值。

我创建了一个新的最小项目,它将重现相同的问题,请参见下文。

主页.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>


MainPage.xaml.cs

这个异常会在经过下面的

InitializeComponent()
行后抛出。

namespace TestSilverlightApp
{
    public partial class MainPage : System.Windows.Controls.UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }
    }
}


ViewModel.cs

ViewModel 类有一个 EntityType 属性,它接受

System.Type
值。

namespace TestSilverlightApp
{
    public class ViewModel
    {
        public System.Type EntityType { get; set; }
    }
}


CustomerEntity.cs

这只是我创建的一个空类,目的是将其类型分配给 ViewModel.EntityType 属性。

namespace TestSilverlightApp
{
    public class CustomerEntity
    { }
}


知道如何解决这个问题吗?我宁愿不实现我自己的

TypeConverter
或在 XAML 中设置
System.Type
值的东西。

silverlight visual-studio-2010 xaml silverlight-4.0
1个回答
0
投票

这是您可以使用的类型转换器:-

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" />
© www.soinside.com 2019 - 2024. All rights reserved.