#.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. Реализация вашего внутреннего контроля может быть нарушена.