Я пытаюсь создать собственное расширение разметки XAML, которое примет тип в качестве аргумента, и во время выполнения разрешите этот тип с помощью контейнера IoC, но при время разработки, просто создайте его с помощью конструктора по умолчанию. На данный момент я просто пытаюсь реализовать часть конструктора по умолчанию. Он будет выглядеть следующим образом:Расширение пользовательской разметки для контекста данных всегда обрабатывается как тип System.Object
<UserControl ...
DataContext="{custom:MyCustomExtension MyType}"
<TextBox Text="{Binding SomeProperty}" />
</UserControl>
Вопрос заключается в том, что дизайнер всегда обрабатывает значение моего расширение производит как объект типа, поэтому я не могу использовать связывание инструментов графического интерфейса, но он отлично работает во время выполнения.
Вот моя очень простая реализация воспроизвести проблему.
[MarkupExtensionReturnType(typeof(object))]
public class MyCustomExtension : MarkupExtension
{
[ConstructorArgument("dataContextType")]
public Type DataContextType { get; set; }
public MyCustomExtension() { }
public MyCustomExtension (Type dataContextType)
{
DataContextType = dataContextType;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Activator.CreateInstance(DataContextType);
}
}
Я попытался использовать отражатель, чтобы изучить, как StaticResourceExtension
делает это, потому что в то время как он также имеет атрибут [MarkupExtensionReturnType(typeof(object))]
, дизайнер VS не имеют проблем с использованием реального типа ресурса, который ссылается, но не смог найти ничего особенного с использованием этого маршрута.
попробуйте, если (DesignerProperties.GetIsInDesignMode (this)), то дайте экземпляр дизайнера или разрешите использование зависимого преобразователя. – RAJ
@ RAJ Это приходит позже. Мой вопрос заключается в решении проблемы дизайнера, прежде чем он придет в IoC. –