WPF / Prism: представления возвращают System.Object - PullRequest
1 голос
/ 02 августа 2011

Я новичок в 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 ]

2 голосов
/ 03 августа 2011

Вы хотели бы посмотреть на 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, чтобы я мог видеть его содержимое.Удачи.

1 голос
/ 02 августа 2011

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

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

...