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