Почему свойства контекста данных во время разработки не распространяются на пользовательские элементы управления?

#.net #wpf #xaml

Вопрос:

У меня есть элемент управления, для которого я задаю контекст времени разработки:

 <UserControl x:Class="My.Namespace.OuterControl"
             xmlns:local="My.Namespace"
             d:DataContext="{d:DesignInstance Type=local:Sample, IsDesignTimeCreatable=True}">
    <StackPanel>
        <!-- This is the version that actually matters -->
        <local:InnerControl Title="{Binding OuterTitle}"/>

        <!-- Alternate versions for comparison purposes -->
        <local:InnerControl Title="Sample Title 2"/>
        <local:InnerControl Title="{Binding OuterTitle}" d:Title="Sample Title 3"/>
        <TextBlock Text="{Binding OuterTitle}"/>
    </StackPanel>
</UserControl>
 

Очевидно, что при этом удалена большая часть деталей и неважных свойств. Важно то, что тип контекста имеет некоторое свойство , которое мы назовем OuterTitle , а внутренний элемент управления имеет свойство зависимости, которое я называю Title .

Проблема в том, что первый экземпляр InnerControl.Title не привязывается во время разработки, и это формулировка, которую мне действительно нужно использовать. Остальные находятся там для сравнения. Нет никакой ошибки или каких-либо указаний на то, почему она не работает, она просто действует так, как будто привязки вообще нет.

Причина, по которой я думаю, что это должно сработать, заключается в следующем:

  • Второй и третий InnerControl теги (с жестко Title заданным или d:Title ) оба показывают правильный заголовок, что доказывает правильность настройки свойства зависимости.
  • Свойство TextBlock , связанное с тем же OuterTitle свойством, также показывает правильный заголовок, что доказывает, что {Binding OuterTitle} выражение действительно работает и что контекст данных внешнего элемента управления является допустимым экземпляром.

Само InnerControl по себе использует привязку данных для отображения значения для Title — однако я подтвердил, что это не причина, потому что я получу тот же результат, если изменю реализацию свойства для использования кода. Что говорит о том, что InnerControl на самом деле никогда не получает правильное значение в первую очередь, несмотря на то, что одно и то же выражение работает в a TextBlock .

Кто-нибудь знает, что здесь за волшебный ингредиент, из-за которого первый InnerControl.Title не появляется в конструкторе? И есть ли для этого обходной путь?

P.S. Пожалуйста, поймите, что это уменьшенный пример, чтобы прояснить проблему. Реальный экземпляр, очевидно, намного сложнее, поэтому предложения типа «укажите d:Title для каждого InnerControl » не будут полезны, так как эта проблема влияет на все дерево конструктора.

Комментарии:

1. Для меня отлично работает, когда внутренний контроль является пользовательским контролем. Его XAML содержит элемент с привязкой RelativeSource к свойству Title. Реализация вашего внутреннего контроля может быть нарушена.