WPF/Prism: представления возвращают System.Object

Я новичок в WPF и Prism, но я уже узнал, что вы должны зарегистрировать View в Unity как объект:

Container.RegisterType<Object,MyView>("My.Assembly.MyView");

Тем не менее, когда я использую

var RelativeUriToMyView = new Uri("My.Assembly.MyView",UriKind.Relative);    
RegionManager.RequestNavigate(RelativeUriToMyView, RegionName, CallbackResult);

MyView отображается как System.Object, а CallbackResult не содержит ошибок.

Что мне не хватает? Я рад предоставить больше информации, если это необходимо.

2 ответа

Решение

Казалось, что проблема была вызвана регистрацией представления с его полным именем (My.Assembly.MyView) вместо его имени (MyView).

Изменить: Изменен вопрос, чтобы более точно отразить проблему.

Вы хотели бы посмотреть на RegionNavigationContentLoader.cs в исходном коде PRISM; Вот код, который загружает представление для вас.

    protected virtual object CreateNewRegionItem(string candidateTargetContract)
    {
        object newRegionItem;

        try
        {
            newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract);
        }
        catch (ActivationException e)
        {
            throw new InvalidOperationException(
                string.Format(CultureInfo.CurrentCulture, Resources.CannotCreateNavigationTarget, candidateTargetContract),
                e);
        }
        return newRegionItem;
    }

Есть несколько вспомогательных методов, которые принимают URI, извлекают строку запроса и создают "имя", используемое для поиска вашего представления и приведения его в качестве объекта.

По сути, имя, которое вы используете, чтобы связать ваш конкретный класс как объект с Unity, - это то же имя, которое вам нужно использовать, когда вы пытаетесь разрешить объект с помощью Unity. Вот некоторый псевдокод, чтобы объяснить,

Container.RegisterType<object, ConcreteClass>(typeof(ConcreteClass).FullName);

Locator.GetInstance<object>(UriWithFullName)

Если ничего из этого не помогло, опубликуйте RelativeUriToMyView, чтобы я мог видеть его содержимое. Удачи.

Другие вопросы по тегам