2016-01-21 7 views
0

Я пытаюсь создать собственное расширение разметки XAML, которое примет тип в качестве аргумента, и во время выполнения разрешите этот тип с помощью контейнера IoC, но при время разработки, просто создайте его с помощью конструктора по умолчанию. На данный момент я просто пытаюсь реализовать часть конструктора по умолчанию. Он будет выглядеть следующим образом:Расширение пользовательской разметки для контекста данных всегда обрабатывается как тип System.Object

<UserControl ... 
      DataContext="{custom:MyCustomExtension MyType}" 

    <TextBox Text="{Binding SomeProperty}" /> 
</UserControl> 

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

Binding Tools Failing

Вот моя очень простая реализация воспроизвести проблему.

[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 не имеют проблем с использованием реального типа ресурса, который ссылается, но не смог найти ничего особенного с использованием этого маршрута.

+0

попробуйте, если (DesignerProperties.GetIsInDesignMode (this)), то дайте экземпляр дизайнера или разрешите использование зависимого преобразователя. – RAJ

+0

@ RAJ Это приходит позже. Мой вопрос заключается в решении проблемы дизайнера, прежде чем он придет в IoC. –

ответ

0

Я попробовал ваши нестандартные разметки в Blend, (Microsoft смеси для Visual Studio Professional 2015), и она работала для меня:

Working

Изменения в этом окне «Создание привязки данных» виден только после того, как перестроить.

Мой XAML:

<Window x:Class="DesignTimeTypedDataContext.MainWindow" 
     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:DesignTimeTypedDataContext" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{local:MyCustom {x:Type local:MainWindowViewModel}}"> 
    <Grid> 
     <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="14.862,19.706,0,0" TextWrapping="Wrap" Text="{Binding Text}" VerticalAlignment="Top"/> 
    </Grid> 
</Window> 

Кстати, я думаю, вы это знаете, но есть d:DataContext, которая дает вам время проектирования DataContext, не влияя на время выполнения.

<Window x:Class="DesignTimeTypedDataContext.MainWindow" 
     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:DesignTimeTypedDataContext" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     d:DataContext="{d:DesignInstance {x:Type local:MainWindowViewModel}}"> 
    <Grid> 
     <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="14.862,19.706,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top"/> 
    </Grid> 
</Window> 

Возможно, это не очень важный ответ, просто я решил поделиться им, возможно, это помогает в отладке. Теперь, по крайней мере, вы знаете, что ваш код работает для некоторых :)

+0

Спасибо за продолжение. Я не использую смесь, поэтому не могу сказать, работает ли она там или нет. Я использую Visual Studio 2015, и я пытаюсь заставить его работать там. Я знаю тег datacontext времени разработки, но я планирую использовать это расширение гораздо больше, чем просто свойство контекста данных, поэтому я не могу зависеть от этого «волшебного тега». –

 Смежные вопросы

  • Нет связанных вопросов^_^