XamlParseException: не удалось создать «System.Type» из текста «local: CustomerEntity» - PullRequest
1 голос
/ 28 сентября 2010

Я получаю это исключение при попытке отладки приложения Silverlight 4 в Visual Studio 2010. Исключение будет вызвано после того, как оно пройдет строку 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.

Я создал новый минимальный проект, который будет воспроизводить ту же проблему, см. Ниже.

MainPage.xaml

Это RootVisual для приложения Silverlight. ViewModel с присвоенным EntityType объявлен в UserControl.Resources.

Я также связал ViewModel с DataContext и специально создал элемент Run в теле, который связан с параметром EntityType. В Visual Studio Designer не возникает проблем с отображением имени типа назначенного EntityType.

Ошибка не возникнет, если я не установил параметр EntityType в XAML.

<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 или что-то другое для установки значения System.Type в XAML.

1 Ответ

0 голосов
/ 28 сентября 2010

Вот конвертер типов, который вы можете использовать: -

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" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...