XamlParseException(XML解析异常错误):未能从文本“local:CustomerEntity”创建“系统.类型”

hts6caw3  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(75)

尝试在Visual Studio 2010中调试Silverlight 4应用程序时遇到此异常。此异常将在它通过InitializeComponent()行后引发。此异常仅在调试期间发生,但对Visual Studio设计器来说似乎不是问题。

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类,它有一个System.Type类型的EntityType属性,该属性将在XAML中赋值。
我创建了一个新的最小项目,将重现相同的问题,见下文。

主页面.xaml

这是Silverlight应用程序的RootVisual。具有指定EntityTypeViewModel是在UserControl.Resources中宣告。
我还将ViewModel绑定到DataContext,并特意在绑定到EntityType参数的主体中创建了一个Run元素。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>

主页. xaml.cs

此异常将在它通过下面的InitializeComponent()行后引发。

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

视图模型. cs

ViewModel类具有接受System.Type值的EntityType属性。

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

客户实体. cs

这只是一个空类,我创建它的目的是将其Type赋给ViewModel.EntityType属性。

namespace TestSilverlightApp
{
    public class CustomerEntity
    { }
}

我不想实现我自己的TypeConverter或其他东西来设置XAML中的System.Type值。

oug3syen

oug3syen1#

下面是一个可以使用的类型转换器:

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" />

相关问题